Skip to content

CI traffic: superseded push runs are never cancelled (21 stale runs, 70 queued macOS jobs on 2026-11-05) #271

Closed

Description

@tae898

On 2026-11-05, with eight merges to main in one day, my push runs piled up: 21 stale runs (mostly Test Python Examples, 4 macOS legs each) were queued behind each other for hours, holding about 70 queued macOS jobs while only 5 macOS jobs run at a time. The release candidate's own macOS legs waited behind them, and the organisation shares its runner cap with ArcadeData/arcadedb, so this is traffic I put on upstream's queue too.

Cause, from the concurrency blocks on main:

Workflow Group today Effect
test-jvm.yml, test-python-examples.yml <workflow>-<PR number or run_id>, cancel only on pull_request a push, a schedule and a dispatch each get a group of their own, so a superseded push run is never cancelled or replaced (the comments in both files say this is deliberate: a superseded run is the record for its commit)
test-native.yml test-native-<PR number or ref>, cancel unless the ref is a tag a newer push to main cancels the older one (good), but a workflow_dispatch on main shares that group, so a manual run can cancel a push run, or be cancelled by the next push
other workflows per PR, or per tag fine

Proposal, using GitHub's own behaviour: with cancel-in-progress: false a group holds at most one running and one pending run, and a newer pending run replaces the older pending one.

  • Pull requests: unchanged (one group per PR, a new push cancels the old run).
  • Push to main, JVM and examples workflows: one group per workflow (<workflow>-main), cancel-in-progress: false. At most one run is testing and one is waiting, and the waiting one is always the newest commit, so a backlog cannot build. A commit that lands while another is waiting is covered by the newer run; each merge was already gated green on its pull request.
  • Nightly schedule: its own group per workflow with cancel-in-progress: true, so a stuck old nightly never blocks a new one.
  • workflow_dispatch and workflow_call (the release, and runs pinned to an engine tag): unchanged, a group of their own per run, never cancelled. A release must never be cancelled by a push.
  • test-native.yml: give workflow_dispatch its own group, so a dispatch and a push cannot cancel each other.
  • Tests in tests/test_select_matrix.py style: a test reads the three concurrency blocks and checks that a release or a dispatch has a group of its own and that a push to main shares one.

Out of scope here, to look at afterwards: the examples workflow runs all 16 legs on every push to main (the pull request ran 4); whether that should be nightly and release only is a separate question.

Timing: after the 26.11.1 tag, because a workflow change triggers runs and the macOS queue is full until the release checks finish.

Activity

  1. added
    concurrencyThreads, transactions and conflicts
    in progressThe team is actively working on this issue
    on Nov 5, 2026
  2. added this to the 26.12.1 milestone on Nov 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    concurrencyThreads, transactions and conflictsin progressThe team is actively working on this issue

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions