Class Queue
- All Implemented Interfaces:
Saveable
This class implements the core scheduling logic. Queue.Task
represents the executable
task that are placed in the queue. While in the queue, it's wrapped into Queue.Item
so that we can keep track of additional data used for deciding what to execute when.
Items in queue goes through several stages, as depicted below:
(enter) --> waitingList --+--> blockedProjects
| ^
| |
| v
+--> buildables ---> pending ---> left
^ |
| |
+---(rarely)---+
Note: In the normal case of events pending items only move to left. However they can move back
if the node they are assigned to execute on disappears before their Executor
thread
starts, where the node is removed before the Queue.Executable
has been instantiated it
is safe to move the pending item back to buildable. Once the Queue.Executable
has been
instantiated the only option is to let the Queue.Executable
bomb out as soon as it starts
to try an execute on the node that no longer exists.
In addition, at any stage, an item can be removed from the queue (for example, when the user cancels a job in the queue.) See the corresponding field for their exact meanings.
- Author:
- Kohsuke Kawaguchi
- See Also:
-
Nested Class Summary
Modifier and TypeClassDescriptionfinal class
Queue.Item
in theblockedProjects
stage.static final class
Queue.Item
in thebuildables
stage.static interface
Represents the real meat of the computation run byExecutor
.static interface
MarksQueue.Task
s that do not consumeExecutor
.static class
Item in a queue.static class
Data structure created for each idleExecutor
.static final class
Queue.Item
in theleftItems
stage.static interface
MarksQueue.Task
s that are not affected by the Jenkins.isQuietingDown() quieting down}, because these tasks keep other tasks executing.static class
Common part betweenQueue.BlockedItem
andQueue.BuildableItem
.static interface
An optional interface for actions on Queue.Item.static class
Extension point for deciding if particular job should be scheduled or not.static final class
Schedulesave()
call for near future once items change.static final class
Simple queue state persistence object.static class
A Stub class forQueue.Item
which exposes only the name of the Task to be displayed when the user has DISCOVERY permissions only.static class
A Stub class forQueue.Task
which exposes only the name of the Task to be displayed when the user has DISCOVERY permissions only.static interface
Task whose execution is controlled by the queue.static interface
MarksQueue.Task
s that are not persisted.static final class
Queue.Item
in thewaitingList
stage. -
Field Summary
Modifier and TypeFieldDescriptionstatic final com.thoughtworks.xstream.XStream
ThisXStream
instance is used to persistQueue.Task
s. -
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionprotected void
_await()
protected void
protected boolean
_tryWithLock
(Runnable runnable) protected <V,
T extends Throwable>
V_withLock
(hudson.remoting.Callable<V, T> callable) Some operations require to be performed with theQueue
lock held.protected void
Some operations require to be performed with theQueue
lock held.protected <V> V
Some operations require to be performed with theQueue
lock held.boolean
Deprecated.boolean
add
(AbstractProject p, int quietPeriod) Deprecated.as of 1.311 Useschedule(Task, int)
boolean
add
(Queue.Task p, int quietPeriod) Deprecated.as of 1.311 Useschedule(Task, int)
boolean
add
(Queue.Task p, int quietPeriod, Action... actions) Deprecated.as of 1.311 Useschedule(Task, int, Action...)
boolean
cancel
(Queue.Item item) boolean
cancel
(Queue.Task p) Cancels the item in the queue.void
clear()
Wipes out all the items currently in the queue, as if all of them are cancelled at once.void
Immediately clear thegetLeftItems()
cache.boolean
Returns true if this queue contains the said project.int
Counts all theQueue.BuildableItem
s currently in the queue.int
How manyQueue.BuildableItem
s are assigned for the given label?org.kohsuke.stapler.HttpResponse
doCancelItem
(long id) Called fromqueue.jelly
andqueue-items.jelly
.getApi()
Deprecated.UsegetItems()
directly.protected List<Queue.BlockedItem>
Gets the snapshot of allQueue.BlockedItem
s.Gets the snapshot of allQueue.BuildableItem
s.Gets all theQueue.BuildableItem
s that are waiting for an executor in the givenComputer
.Returns an array of Item for which it is only visible the name of the task.static Queue
getItem
(long id) Gets the information about the queue item for the given project.getItems()
Gets a snapshot of items in the queue.Gets the information about the queue item for the given project.Returns the snapshot of allQueue.LeftItem
s.Gets the snapshot of allQueue.BuildableItem
s.Gets all items that are in the queue but not blockedWorks just likegetUnblockedItems()
but return tasks.static boolean
Deprecated.UseisBlockedByShutdown(hudson.model.Queue.Task)
instead.static void
Restores the queue content during the start up.static boolean
Checks whether a task should not be scheduled becauseJenkins.isQuietingDown()
.boolean
isEmpty()
boolean
Is the given task currently pending execution?void
load()
Loads the queue contents that wassaved
.void
maintain()
Queue maintenance.void
save()
Persists the queue contents to the disk.Schedule a new build for this project.schedule
(Queue.Task p, int quietPeriod) schedule
(Queue.Task p, int quietPeriod, Action... actions) Convenience wrapper method aroundschedule(Task, int, List)
schedule
(Queue.Task p, int quietPeriod, List<Action> actions) Deprecated.as of 1.521 Useschedule2(Task, int, List)
schedule2
(Queue.Task p, int quietPeriod, Action... actions) Convenience wrapper method aroundschedule2(Task, int, List)
schedule2
(Queue.Task p, int quietPeriod, List<Action> actions) Schedules an execution of a task.Future<?>
Checks the queue and runs anything that can be run.void
setLoadBalancer
(LoadBalancer loadBalancer) void
setSorter
(QueueSorter sorter) int
How manyQueue.BuildableItem
s are assigned for the given label?static boolean
tryWithLock
(Runnable runnable) static <V,
T extends Throwable>
VwithLock
(hudson.remoting.Callable<V, T> callable) Some operations require theQueue
lock held.static void
Some operations require to be performed with theQueue
lock held.static <V> V
Some operations require to be performed with theQueue
lock held.static <V,
T extends Throwable>
hudson.remoting.Callable<V,T> wrapWithLock
(hudson.remoting.Callable<V, T> callable) Wraps aCallable
with theQueue
lock held.static Runnable
wrapWithLock
(Runnable runnable) static <V> Callable<V>
wrapWithLock
(Callable<V> callable) Methods inherited from class hudson.model.ResourceController
canRun, execute, getBlockingActivity, getMissingResource
-
Field Details
-
XSTREAM
public static final com.thoughtworks.xstream.XStream XSTREAMThisXStream
instance is used to persistQueue.Task
s.
-
-
Constructor Details
-
Queue
-
-
Method Details
-
getLoadBalancer
-
setLoadBalancer
-
getSorter
-
setSorter
-
load
public void load()Loads the queue contents that wassaved
. -
save
public void save()Persists the queue contents to the disk. -
clear
public void clear()Wipes out all the items currently in the queue, as if all of them are cancelled at once. -
add
Deprecated.as of 1.311 Useschedule(AbstractProject)
-
schedule
Schedule a new build for this project.- See Also:
-
add
Deprecated.as of 1.311 Useschedule(Task, int)
Schedules a new build with a custom quiet period.Left for backward compatibility with <1.114.
- Since:
- 1.105
-
schedule
Deprecated.as of 1.521 Useschedule2(Task, int, List)
-
schedule2
Schedules an execution of a task.- Parameters:
actions
- These actions can be used for associating information scoped to a particular build, to the task being queued. Upon the start of the build, theseAction
s will be automatically added to theRun
object, and hence available to everyone. For the convenience of the caller, this list can contain null, and those will be silently ignored.- Returns:
ScheduleResult.Refused
if Jenkins refused to add this task into the queue (for example because the system is about to shutdown.) Otherwise the task is either merged into existing items in the queue (in which case you getScheduleResult.Existing
instance back), or a new item gets created in the queue (in which case you getScheduleResult.Created
. Note the nature of the queue is that suchQueue.Item
only captures the state of the item at a particular moment, and by the time you inspect the object, some of its information can be already stale. That said, one can still look atQueue.Item.future
,Queue.Item.getId()
, etc.- Since:
- 1.311
-
add
Deprecated.as of 1.311 Useschedule(Task, int)
-
schedule
-
add
Deprecated.as of 1.311 Useschedule(Task, int, Action...)
-
schedule
Convenience wrapper method aroundschedule(Task, int, List)
-
schedule2
Convenience wrapper method aroundschedule2(Task, int, List)
-
cancel
Cancels the item in the queue. If the item is scheduled more than once, cancels the first occurrence.- Returns:
- true if the project was indeed in the queue and was removed. false if this was no-op.
-
cancel
-
doCancelItem
public org.kohsuke.stapler.HttpResponse doCancelItem(@QueryParameter long id) throws IOException, jakarta.servlet.ServletException Called fromqueue.jelly
andqueue-items.jelly
.- Throws:
IOException
jakarta.servlet.ServletException
-
isEmpty
public boolean isEmpty() -
getItems
Gets a snapshot of items in the queue. Generally speaking the array is sorted such that the items that are most likely built sooner are at the end. -
getDiscoverableItems
@Restricted(org.kohsuke.accmod.restrictions.NoExternalUse.class) @Exported(inline=true) public Queue.StubItem[] getDiscoverableItems()Returns an array of Item for which it is only visible the name of the task. Generally speaking the array is sorted such that the items that are most likely built sooner are at the end. -
getApproximateItemsQuickly
Deprecated.UsegetItems()
directly. As of 1.607 the approximation is no longer needed.LikegetItems()
, but returns an approximation that might not be completely up-to-date.At the expense of accuracy, this method does not usually lock
Queue
and therefore is faster in a highly concurrent situation.The list obtained is an accurate snapshot of the queue at some point in the past. The snapshot is updated and normally no more than one second old, but this is a soft commitment that might get violated when the lock on
Queue
is highly contended.This method is primarily added to make UI threads run faster.
- Since:
- 1.483
-
getItem
-
getBuildableItems
Gets all theQueue.BuildableItem
s that are waiting for an executor in the givenComputer
. -
getBuildableItems
Gets the snapshot of allQueue.BuildableItem
s. -
getPendingItems
Gets the snapshot of allQueue.BuildableItem
s. -
getBlockedItems
Gets the snapshot of allQueue.BlockedItem
s. -
getLeftItems
Returns the snapshot of allQueue.LeftItem
s.- Since:
- 1.519
-
clearLeftItems
public void clearLeftItems()Immediately clear thegetLeftItems()
cache. Useful for tests which need to verify that no links to a build remain.- Since:
- 1.519
-
getUnblockedItems
Gets all items that are in the queue but not blocked- Since:
- 1.402
-
getUnblockedTasks
Works just likegetUnblockedItems()
but return tasks.- Since:
- 1.402
-
isPending
Is the given task currently pending execution? -
countBuildableItemsFor
How manyQueue.BuildableItem
s are assigned for the given label?- Parameters:
l
- Label to be checked. If null, any label will be accepted. If you want to countQueue.BuildableItem
s without assigned labels, usestrictCountBuildableItemsFor(hudson.model.Label)
.- Returns:
- Number of
Queue.BuildableItem
s for the specified label.
-
strictCountBuildableItemsFor
How manyQueue.BuildableItem
s are assigned for the given label?The implementation is quite similar to
countBuildableItemsFor(hudson.model.Label)
, but it has another behavior for null parameters.- Parameters:
l
- Label to be checked. If null, only jobs without assigned labels will be taken into the account.- Returns:
- Number of
Queue.BuildableItem
s for the specified label. - Since:
- 1.615
-
countBuildableItems
public int countBuildableItems()Counts all theQueue.BuildableItem
s currently in the queue. -
getItem
Gets the information about the queue item for the given project.- Returns:
- null if the project is not in the queue.
-
getItems
Gets the information about the queue item for the given project.- Returns:
- empty if the project is not in the queue.
-
contains
Returns true if this queue contains the said project. -
scheduleMaintenance
Checks the queue and runs anything that can be run.When conditions are changed, this method should be invoked.
This wakes up one
Executor
so that it will maintain a queue. -
withLock
Some operations require to be performed with theQueue
lock held. Use one of these methods rather than locking directly on Queue in order to allow for future refactoring.- Parameters:
runnable
- the operation to perform.- Since:
- 1.592
-
withLock
Some operations require theQueue
lock held. Use one of these methods rather than locking directly on Queue in order to allow for future refactoring.- Type Parameters:
V
- the type of return valueT
- the type of exception.- Parameters:
callable
- the operation to perform.- Returns:
- the result of the callable.
- Throws:
T
- the exception of the callable- Since:
- 1.592
-
withLock
Some operations require to be performed with theQueue
lock held. Use one of these methods rather than locking directly on Queue in order to allow for future refactoring.- Type Parameters:
V
- the type of return value- Parameters:
callable
- the operation to perform.- Returns:
- the result of the callable.
- Throws:
Exception
- if the callable throws an exception.- Since:
- 1.592
-
tryWithLock
- Parameters:
runnable
- the operation to perform.- Returns:
true
if the lock was available and the operation was performed.- Since:
- 1.618
-
wrapWithLock
- Parameters:
runnable
- the operation to wrap.- Since:
- 1.618
-
wrapWithLock
public static <V,T extends Throwable> hudson.remoting.Callable<V,T> wrapWithLock(hudson.remoting.Callable<V, T> callable) Wraps aCallable
with theQueue
lock held.- Parameters:
callable
- the operation to wrap.- Since:
- 1.618
-
wrapWithLock
- Parameters:
callable
- the operation to wrap.- Since:
- 1.618
-
_await
- Overrides:
_await
in classResourceController
- Throws:
InterruptedException
-
_signalAll
protected void _signalAll()- Overrides:
_signalAll
in classResourceController
-
_withLock
Some operations require to be performed with theQueue
lock held. Use one of these methods rather than locking directly on Queue in order to allow for future refactoring.- Overrides:
_withLock
in classResourceController
- Parameters:
runnable
- the operation to perform.- Since:
- 1.592
-
_tryWithLock
- Parameters:
runnable
- the operation to perform.- Returns:
true
if the lock was available and the operation was performed.- Since:
- 1.618
-
_withLock
Some operations require to be performed with theQueue
lock held. Use one of these methods rather than locking directly on Queue in order to allow for future refactoring.- Overrides:
_withLock
in classResourceController
- Type Parameters:
V
- the type of return valueT
- the type of exception.- Parameters:
callable
- the operation to perform.- Returns:
- the result of the callable.
- Throws:
T
- the exception of the callable- Since:
- 1.592
-
_withLock
Some operations require to be performed with theQueue
lock held. Use one of these methods rather than locking directly on Queue in order to allow for future refactoring.- Overrides:
_withLock
in classResourceController
- Type Parameters:
V
- the type of return value- Parameters:
callable
- the operation to perform.- Returns:
- the result of the callable.
- Throws:
Exception
- if the callable throws an exception.- Since:
- 1.592
-
maintain
public void maintain()Queue maintenance.Move projects between
waitingList
,blockedProjects
,buildables
, andpendings
appropriately.Jenkins internally invokes this method by itself whenever there's a change that can affect the scheduling (such as new node becoming online, # of executors change, a task completes execution, etc.), and it also gets invoked periodically (see
Queue.MaintainTask
.) -
ifBlockedByHudsonShutdown
Deprecated.UseisBlockedByShutdown(hudson.model.Queue.Task)
instead. -
isBlockedByShutdown
Checks whether a task should not be scheduled becauseJenkins.isQuietingDown()
.- Parameters:
task
- some queue task- Returns:
- true if
Jenkins.isQuietingDown()
unless this is aQueue.NonBlockingTask
- Since:
- 1.598
-
getApi
-
getInstance
-
init
Restores the queue content during the start up.
-
schedule(AbstractProject)