From a6a0502d62ff8fccd77bfe80d0a280fb9ac23156 Mon Sep 17 00:00:00 2001 From: Rongsong Shen Date: Fri, 25 Sep 2026 13:07:56 +0000 Subject: [PATCH] chore(buglog): bug-1768 fixed (34c52ccb); log bug-1863 Co-Authored-By: Claude Opus 5.5 (1M context) --- .wolf/buglog.json | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/.wolf/buglog.json b/.wolf/buglog.json index 36c7fc47..f787d6c8 100644 --- a/.wolf/buglog.json +++ b/.wolf/buglog.json @@ -25237,9 +25237,9 @@ }, { "id": "bug-1768", - "status": "open", - "status_updated": "2026-09-24", - "status_note": "nested COMPOUND/ALTER primaries skip slot/rusage checks (seqjob_allocator.c, parjob_allocator.c)", + "status": "fixed", + "status_updated": "2026-09-25", + "status_note": "34c52ccb", "timestamp": "2026-09-04T00:00:00Z", "error_message": "OPEN, NOT A CRASH -- pre-existing, out-of-scope gap discovered during scheduler-allocation task 5.1's review (cache/dispatch wiring). seqjob_prepare_allocation() (src/scheduler/src/plugins/seqjob_allocator.c) and parjob_prepare_allocation() (src/scheduler/src/plugins/parjob_allocator.c) both silently `return 0` whenever `ctx->schedobj->tag != XCE_RESREQ_PRIMARY`. For a primary resource request nested inside a COMPOUND (or, transitively, an ALTER) job, `ctx->schedobj` remains the enclosing COMPOUND object for the entire per-primary allocation loop -- it is never swapped to a per-primary object -- so this guard fires for every nested primary and both prepare-allocation hooks no-op unconditionally.", "root_cause": "CONFIRMED via direct code read and `git log --follow -p`: the `ctx->schedobj->tag != XCE_RESREQ_PRIMARY` guard predates the entire scheduler-allocation feature (introduced in commit 12dcc2a6, months before this branch's base commit 5a670676); task 3.1's seqjob rewrap (b18c5f78) did not touch or introduce it. Effect: `ctx->alloc_req.host`/`ctx->alloc_req.shared` are never populated for a nested primary's resource want, so `sched_check_host_satisfy()` trivially passes against an empty want vector regardless of a candidate host's real free capacity. Only the SELECT expression (if the resreq specifies one) still gates candidate hosts for a nested primary -- slot count and rusage (memory, etc.) are unconditionally treated as satisfied. This means every COMPOUND job (and transitively every ALTER job, since ALTER delegates to COMPOUND dispatch) with a nested primary resource request has never had its real slots/rusage availability checked by the scheduler, since this guard was introduced.", @@ -27951,6 +27951,26 @@ "related_bugs": [], "occurrences": 1, "last_seen": "2026-09-24T15:24:57Z" + }, + { + "id": "bug-1863", + "status": "open", + "status_updated": "2026-09-25", + "status_note": "multi-primary COMPOUND: each primary's alloc overwrites ctx->alloc; needs merge", + "timestamp": "2026-09-25T13:07:56Z", + "error_message": "A COMPOUND resreq with 2+ primaries (e.g. '1*{A} + 2*{B}') keeps only the LAST primary's allocation: seqjob/parjob my_alloc assign ctx->alloc = make_job_alloc(...) per primary, overwriting (and leaking) the previous primary's job alloc, while every primary's hosts were already debited into ctx->uncomitted -- the dispatched allocation omits earlier primaries' hosts and accounting diverges from the decision.", + "file": "src/scheduler/src/scheduler.c,src/scheduler/src/plugins/seqjob_allocator.c,src/scheduler/src/plugins/parjob_allocator.c", + "root_cause": "sched_make_compound_alloc_() (scheduler.c) loops primaries on one ctx; each allocator's success path replaces ctx->alloc instead of merging host allocs (and shared allocs) across primaries. Latent until bug-1768 (fixed 2026-09-25) because nested primaries previously requested nothing.", + "fix": "", + "tags": [ + "scheduler", + "allocation", + "compound", + "accounting" + ], + "related_bugs": [], + "occurrences": 1, + "last_seen": "2026-09-25T13:07:56Z" } ] }