From a8ed66475569be4fd231b48624ad03a7ca32cc54 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 15 Sep 2013 08:10:23 -0700 Subject: [PATCH] A Trigger timer thread is used for many things, so its execution can delay significantly. Use our own queue --- core/src/main/java/hudson/model/Queue.java | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/hudson/model/Queue.java b/core/src/main/java/hudson/model/Queue.java index da7cdfb96d..b4fc52ba14 100644 --- a/core/src/main/java/hudson/model/Queue.java +++ b/core/src/main/java/hudson/model/Queue.java @@ -93,6 +93,7 @@ import java.util.NoSuchElementException; import java.util.Set; import java.util.Timer; import java.util.TreeSet; +import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.Future; @@ -106,6 +107,7 @@ import javax.servlet.ServletException; import jenkins.model.Jenkins; import jenkins.security.QueueItemAuthenticator; import jenkins.security.QueueItemAuthenticatorConfiguration; +import jenkins.util.AtmostOneTaskExecutor; import org.acegisecurity.AccessDeniedException; import org.acegisecurity.Authentication; import org.kohsuke.stapler.HttpResponse; @@ -246,6 +248,7 @@ public class Queue extends ResourceController implements Saveable { this.workUnit = p; assert executor.isParking(); executor.start(workUnit); + // LOGGER.info("Starting "+executor.getName()); } @Override @@ -295,6 +298,14 @@ public class Queue extends ResourceController implements Saveable { private volatile transient QueueSorter sorter; + private transient final AtmostOneTaskExecutor maintainerThread = new AtmostOneTaskExecutor(new Callable() { + @Override + public Void call() throws Exception { + maintain(); + return null; + } + }); + public Queue(LoadBalancer loadBalancer) { this.loadBalancer = loadBalancer.sanitize(); // if all the executors are busy doing something, then the queue won't be maintained in @@ -910,7 +921,8 @@ public class Queue extends ResourceController implements Saveable { * This wakes up one {@link Executor} so that it will maintain a queue. */ public void scheduleMaintenance() { - new MaintainTask(this).once(); + // LOGGER.info("Scheduling maintenance"); + maintainerThread.submit(); } /** @@ -1073,6 +1085,7 @@ public class Queue extends ResourceController implements Saveable { } private boolean makePending(BuildableItem p) { + // LOGGER.info("Making "+p.task+" pending"); // REMOVE p.isPending = true; return pendings.add(p); } @@ -1994,13 +2007,6 @@ public class Queue extends ResourceController implements Saveable { } } - private void once() { - Timer timer = Trigger.timer; - if (timer != null) { - timer.schedule(this,0); - } - } - protected void doRun() { Queue q = queue.get(); if (q != null) -- GitLab