feat(scheduler-core): add controller-side OPCode_schedAdmin dispatch (task 10.1)
Adds the spec's one and only src/controller/ change: a new case OPCode_schedAdmin in myreq_handler() (cluster.c) that mirrors the existing OPCode_upgradeConfig case -- primary-only gate, explicit reply on every path, stateless pass-through with no WAL entry. Forwards to the scheduler via a new xce_schedadmin_req() (async send, mirrors xce_fetchfile_req) and blocks the vtask thread on a condvar with a 5s deadline while holding c->sched.lock for the round-trip, matching this spec's own research-phase design decision (parity with OPCode_upgradeConfig's no-RBAC posture, blocking wait accepted for low-frequency admin traffic). A new branch in the existing OPCode_reply case demuxes the scheduler's SchedAdminReply to a process-global single-slot pending-waiter mechanism, serialized by c->sched.lock, matching job.c's existing fetchfile-proxy pattern. Adversarial review independently traced double-free/cleanup, the timeout/signal race, and reply-opcode demux correctness against source; found and a follow-up round closed a narrow-window leak via a carefully lock-ordered unlock->unregister->relock sequence (avoiding an AB-BA inversion against schedadmin_signal()'s lock acquisition order). New test_sched_admin_dispatch.c drives the real myreq_handler via the existing myreq_handler_for_test seam: not-primary rejection (proven via a poison-pointer sched.ep that would crash if forwarding were ever attempted), not-connected rejection, and a genuine two-thread round-trip test exercising the real signal/demux path. Controller suite 3/3 (1090/1090 assertions), scheduler suite 26/26 unaffected, clang-format clean.
This commit is contained in:
parent
2d533e652e
commit
045be6b3d6
7 changed files with 598 additions and 3 deletions
|
|
@ -2206,6 +2206,30 @@ int xce_fetchfile_req(endpoint_t* ep, xce_fetchfile_t* msg)
|
|||
return xce_request(ep, &request);
|
||||
}
|
||||
|
||||
/* xce_schedadmin_req: send OPCode_schedAdmin (SchedAdminRequest) to `ep`.
|
||||
* Async send only, mirrors xce_fetchfile_req above -- the controller
|
||||
* (myreq_handler, cluster.c) forwards xceadmin's SchedAdminRequest to the
|
||||
* scheduler via this function, then blocks separately for the matching
|
||||
* SchedAdminReply (scheduler-core task 10.1, Req 5.10). */
|
||||
int xce_schedadmin_req(endpoint_t* ep, sched_admin_req_t* msg)
|
||||
{
|
||||
/* clang-format off */
|
||||
xce_request_t request = {
|
||||
.opcode = OPCode_schedAdmin,
|
||||
.body_which = Request_body_schedadminmsg,
|
||||
.body = {
|
||||
.schedadminmsg = msg
|
||||
}
|
||||
};
|
||||
/* clang-format on */
|
||||
|
||||
if ((ep == NULL) || (msg == NULL)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return xce_request(ep, &request);
|
||||
}
|
||||
|
||||
/* ── Client-Side Transparent Retry tunables (Req 6.1, 6.2) ─────────────────
|
||||
*
|
||||
* XCE_RETRY_DEFAULTS provides safe production defaults for the failover retry
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue