KestrelDocs

Runs

Runs wait in one queue per workspace and start in the order they came in, as workers free up. Nothing is dropped and nothing jumps the line.

Fig. 1Queue backlog
Queue backlog float field(vec2 p, float t) { if (p.x < 18.0 || p.x > 702.0) return 0.0; float ph = TAU * t / T; // how full the basin is: rises while the inflow is fast, drains after float level = 0.22 + 0.66 * (sm(0.2, 2.0, t) - sm(2.4, 4.2, t)); vec2 q = (p - vec2(360.0, 300.0)) / vec2(150.0, 110.0); float inside = step(abs(q.x), 1.0) * step(q.y, 1.0) * step(-1.0, q.y); float surface = 1.0 - 2.0 * level; float body = inside * sm(surface - 0.04, surface + 0.04, q.y) * (0.45 + 0.35 * (q.y - surface) / 2.0); float v = body * (0.85 + 0.15 * noise(p * 0.06 + 2.0 * vec2(cos(ph), sin(ph)))); // the inflow: heavy while the queue grows float pour = 0.25 + 0.6 * (1.0 - sm(1.6, 2.4, t)) * sm(0.0, 0.3, t); v += seg(p, vec2(140.0, 80.0), vec2(300.0, 300.0 - 220.0 * level + 10.0), 10.0, pour * 0.6); // three workers under the floor, pulsing as they take a job for (int i = 0; i < 3; i++) { float fi = float(i); v += blob(p, vec2(270.0 + 90.0 * fi, 432.0), 16.0, 0.5 + 0.35 * pow(0.5 + 0.5 * sin(ph * 3.0 - fi * 2.1), 4.0)); } return v; }
Tasks pile up during a release and workers take them from the front as each one frees up. The queue drains in order until it is empty.

How runs start

A new run joins the back of the queue. When a slot is free, the run at the front gets a sandbox and starts. A workspace has as many slots as its plan allows.

PlanConcurrent runs
Hobby1
Team20
EnterpriseSet by contract

Watch the queue

Terminal
kestrel runs list --status queued

run_9a01   acme/web-app    queued   position 1   waited 12 s
run_9a02   acme/api        queued   position 2   waited 9 s
run_9a03   acme/web-app    queued   position 3   waited 2 s

A queued run reports its position, so a dashboard or a CI job can show how long it may wait.

One repo at a time

Two runs on the same repo can open pull requests that clash. Set per_repo to keep a repo to one run at a time; other repos keep starting while it works.

kestrel.yaml
queue:
  per_repo: 1
Note

A run waiting on a spend limit or a rate limit keeps its place in the queue. It starts as soon as the limit allows.

Was this page helpful?

Open the dashboard