Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 11 additions & 8 deletions .github/workflows/work-queue-stress.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@ on:
paths:
- '.github/workflows/work-queue-stress.yml'
- '.github/scripts/work-queue-stress*.cjs'
- 'actions/setup/js/**/*.cjs'
- 'actions/setup/js/**/*.js'
- 'actions/setup/js/**/*work_queue*.cjs'
- 'actions/setup/js/**/*work_queue*.js'
- 'specs/work-queue/**'
push:
branches: [main]
paths:
- '.github/workflows/work-queue-stress.yml'
- '.github/scripts/work-queue-stress*.cjs'
- 'actions/setup/js/**/*.cjs'
- 'actions/setup/js/**/*.js'
- 'actions/setup/js/**/*work_queue*.cjs'
- 'actions/setup/js/**/*work_queue*.js'
- 'specs/work-queue/**'

permissions:
Expand All @@ -33,6 +33,9 @@ jobs:
name: Local Git and concurrent workers
runs-on: ubuntu-latest
timeout-minutes: 20
env:
HISTORY_ITEMS: ${{ github.event_name == 'pull_request' && '256' || '100000' }}
LIFECYCLE_ITEMS: ${{ github.event_name == 'pull_request' && '16' || '1024' }}
Comment on lines +37 to +38
steps:
- name: Checkout code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
Expand All @@ -51,18 +54,18 @@ jobs:
node --test .github/scripts/work-queue-stress.test.cjs .github/scripts/work-queue-stress-summary.test.cjs \
| tee stress-results/invariants.tap

- name: Replay 100000 retained Work and Claim items
- name: Replay retained Work and Claim items
id: history
run: |
node .github/scripts/work-queue-stress.cjs \
--mode history --items 100000 --workers 2 --seed 7 \
--mode history --items "$HISTORY_ITEMS" --workers 2 --seed 7 \
--timeout-seconds 300 > stress-results/history.json

- name: Complete 1024 concurrent worker lifecycles
- name: Complete concurrent worker lifecycles
id: lifecycle
run: |
node .github/scripts/work-queue-stress.cjs \
--items 1024 --workers 4 --queue-items 64 --seed 7 \
--items "$LIFECYCLE_ITEMS" --workers 4 --queue-items 64 --seed 7 \
--timeout-seconds 600 > stress-results/lifecycle.json

- name: Verify single-queue admission saturation
Expand Down
26 changes: 16 additions & 10 deletions actions/setup/js/work_queue_stress_workflow.test.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,24 @@ const workflow = document.toJS();
const pins = JSON.parse(readFileSync(resolve(root, ".github/aw/actions-lock.json"), "utf8")).entries;

describe("local work queue stress CI", () => {
it("runs separately on JavaScript pull requests and main pushes", () => {
it("runs only for work queue JavaScript pull requests and main pushes", () => {
for (const event of ["pull_request", "push"]) {
expect(workflow.on[event].paths).toContain("actions/setup/js/**/*.cjs");
expect(workflow.on[event].paths).toContain("actions/setup/js/**/*.js");
expect(workflow.on[event].paths).toContain("actions/setup/js/**/*work_queue*.cjs");
expect(workflow.on[event].paths).toContain("actions/setup/js/**/*work_queue*.js");
expect(workflow.on[event].paths).toContain(".github/scripts/work-queue-stress*.cjs");
expect(workflow.on[event].paths).toContain(".github/workflows/work-queue-stress.yml");
const paths = workflow.on[event].paths;
for (const file of ["actions/setup/js/work_queue_store.cjs", "actions/setup/js/finish_work_queue_claim.cjs", "actions/setup/js/subdir/work_queue_helper.js", ".github/scripts/work-queue-stress-worker.cjs"]) {
expect(paths.some(pattern => minimatch(file, pattern))).toBe(true);
}
for (const file of ["actions/setup/js/start_mcp_gateway.cjs", "actions/setup/js/unrelated.js", "docs/README.md"]) {
expect(paths.some(pattern => minimatch(file, pattern))).toBe(false);
}
}
expect(workflow.on.push.branches).toEqual(["main"]);
expect(workflow.on.pull_request_target).toBeUndefined();
expect(Object.keys(workflow.jobs)).toEqual(["stress"]);
expect(workflow.jobs.stress.needs).toBeUndefined();
const paths = workflow.on.pull_request.paths;
for (const file of ["actions/setup/js/work_queue_store.cjs", "actions/setup/js/finish_work_queue_claim.cjs", "actions/setup/js/scripts/queue.cjs", ".github/scripts/work-queue-stress-worker.cjs"]) {
expect(paths.some(pattern => minimatch(file, pattern))).toBe(true);
}
expect(paths.some(pattern => minimatch("docs/README.md", pattern))).toBe(false);
});

it("uses read-only checkout, pinned actions, bounded execution and failure diagnostics", () => {
Expand All @@ -48,9 +50,13 @@ describe("local work queue stress CI", () => {
});

it("separates retained-history scale from live completions and admission limits", () => {
expect(workflow.jobs.stress.env).toEqual({
HISTORY_ITEMS: "${{ github.event_name == 'pull_request' && '256' || '100000' }}",
LIFECYCLE_ITEMS: "${{ github.event_name == 'pull_request' && '16' || '1024' }}",
});
const commands = workflow.jobs.stress.steps.filter(step => step.run).map(step => step.run);
expect(commands.some(command => command.includes("--mode history --items 100000 --workers 2") && command.includes("--timeout-seconds 300"))).toBe(true);
expect(commands.some(command => command.includes("--items 1024 --workers 4 --queue-items 64") && command.includes("--timeout-seconds 600"))).toBe(true);
expect(commands.some(command => command.includes('--mode history --items "$HISTORY_ITEMS" --workers 2') && command.includes("--timeout-seconds 300"))).toBe(true);
expect(commands.some(command => command.includes('--items "$LIFECYCLE_ITEMS" --workers 4 --queue-items 64') && command.includes("--timeout-seconds 600"))).toBe(true);
expect(commands.some(command => command.includes("--mode saturation --items 100000 --workers 4") && command.includes("--timeout-seconds 60"))).toBe(true);
expect(commands.some(command => command.includes("node --test .github/scripts/work-queue-stress.test.cjs"))).toBe(true);
});
Expand Down
Loading