feat(worker-rejoin-resync): task 6.1 - trigger reconciliation on rejoin
Arm a reconciliation round in apply_join_state() the moment a worker host becomes connected (first join, reconnect, or failover-reconnect - all routed through the same shared call site, Req 1.1-1.3), then send the query from on_worker_join() strictly after the join reply and existing config push (Req 2.1-2.2), verified via a structural test that reads real wire order off the endpoint queue. Also closes Req 3.7's config-delivery seam end-to-end: worker_resync_ window_ms now rides the existing Conf4Worker push (clustername precedent, no new opcode) and the worker applies it to its retention window on receipt. Fixes bug-1752: myreq_handler had no OPCode_push dispatch case at all, so every config push - including the pre-existing clustername field - was silently discarded. Confirmed harmless until now (clustername was never read anywhere in src/worker/); closed narrowly for worker_resync_window_ms only. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Y4M5MJM2zK6nU43da267Ku
This commit is contained in:
parent
48c6cfd58a
commit
a3d12d37d9
8 changed files with 1045 additions and 3 deletions
|
|
@ -20495,6 +20495,33 @@
|
|||
],
|
||||
"occurrences": 1,
|
||||
"last_seen": "2026-09-01T09:00:00Z"
|
||||
},
|
||||
{
|
||||
"id": "bug-1752",
|
||||
"timestamp": "2026-09-01T10:00:00Z",
|
||||
"error_message": "worker-rejoin-resync task 6.1 (worker-side config-delivery gap): tasks.md's own task text says to have 'the worker's existing config-receive handling call xcecd_finished_job_retention_set_window_ms() with the received value' -- premised on some existing per-field config-receive dispatch already existing at the worker that just needed one more field wired in. Investigating before implementing (reading src/worker/src/controller_connector.c's myreq_handler dispatch switch and src/lib/xcectx.c's vtask_entry, which decodes every inbound request before myreq_handler ever sees it) found this premise false: myreq_handler's switch had NO case for OPCode_push at all (only OPCode_startjob/runtasks/jobcontrol/fetchfile/jobStateQuery existed) -- a config push (Request_body_configpushmsg, the body_which xce_pushconfig_req()/worker_push_config() send) fell straight through to `default: break;` and was silently discarded in its entirety, for EVERY field including the pre-existing clustername, not just the not-yet-added workerResyncWindowMs. xcecd_finished_job_retention_set_window_ms()'s own doc comment (xcecd_worker_utils.h, task 4.1) had already independently found and documented the same gap ('the worker daemon has no runtime delivery path for this ClusterConfig field today... worker_push_config() only ever pushes hosttype/hostmodel/resource confvars via collect_confvars()... this setter is the seam a later task wires the real operator-configured value into once that delivery path exists') -- task 6.1 is that later task, but its own task text still assumed the delivery path itself already existed when it did not.",
|
||||
"file": "src/worker/src/controller_connector.c",
|
||||
"root_cause": "No prior worker-rejoin-resync task (nor any task before this spec) ever needed the worker to consume ANY field off an OPCode_push config push, so myreq_handler's dispatch switch was never extended to handle that opcode at all -- xcectx.c's vtask_entry only special-cases the OTHER OPCode_push shape (Request_body_pushmsg, the generic job/worker/resource list-table push used for scheduler/apiserver connections) before handing off to the registered handler; a Request_body_configpushmsg-shaped OPCode_push passes through unmodified into myreq_handler's default: break; case. This predates worker-rejoin-resync entirely and was simply never exercised or noticed because nothing at the worker previously needed any pushed ClusterConfig field.",
|
||||
"fix": "FIXED (2026-09-01, task 6.1, found live during implementation, same design-vs-reality-correction pattern as bug-1746/1747/1748/1751 earlier in this spec). Added a new case OPCode_push: to myreq_handler's dispatch switch, routing to a new handle_pushconfig() function that checks body_which == Request_body_configpushmsg and configdata->data_which == ConfigData_data_workerconfig before reading conf4worker->worker_resync_window_ms and calling xcecd_finished_job_retention_set_window_ms() with it -- scoped narrowly to closing the one seam task 6.1 needs (workerResyncWindowMs), not a general config-receive rework: clustername/confvars remain unconsumed by the worker, unchanged and explicitly out of this task's boundary. New tests in src/worker/testsuite/test_controller_connector.c (white-box, real wire encode via xce_pushconfig_req + real xce_decode + myreq_handler dispatch) cover: the real value reaching the retention setter exactly once, a second/different value also applied (proves live read, not memoized), a non-workerconfig ConfigData arm being ignored, and a NULL configpushmsg being a safe no-op.",
|
||||
"tags": [
|
||||
"worker-rejoin-resync",
|
||||
"task-6.1",
|
||||
"controller_connector-c",
|
||||
"myreq_handler",
|
||||
"requirement-3.7",
|
||||
"config-push",
|
||||
"design-reality-mismatch",
|
||||
"found-live-during-implementation",
|
||||
"fixed"
|
||||
],
|
||||
"related_bugs": [
|
||||
"bug-1746",
|
||||
"bug-1747",
|
||||
"bug-1748",
|
||||
"bug-1751"
|
||||
],
|
||||
"occurrences": 1,
|
||||
"last_seen": "2026-09-01T10:00:00Z"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue