feat(controller): clusterconfig-schema-split task 6.2 — wire CLI tunables into init_controller_tunables (optional, Req 6)

Wires all 11 task-6.1 CLI-sourced myconf_t fields into
init_controller_tunables() via the codebase's existing 0-sentinel fallback
idiom ((myconf->x > 0) ? myconf->x : <original hardcoded constant>);
omitting all flags reproduces today's exact hardcoded values.

Resolves both gaps flagged in task 6.1's review: resmgr_inst_delta bridges
to the existing tunables.resmgr_inst field by meaning (confirmed via
zarray_init's delta parameter), and xstrings_delta is deliberately left
unwired with an operator-facing WARN rather than adding a dead field --
the underlying xstring_table_init/kv_params_t has no delta/growth-step
concept at all, unlike the kvmgr-backed jobmgr/workermgr/qmgr/resmgr.

This completes clusterconfig-schema-split -- all required tasks (1.1-5.3)
and optional Requirement 6 tasks (6.1-6.2) are done.
This commit is contained in:
Rongsong Shen 2026-07-21 07:58:29 +00:00
parent c3107b954a
commit 553da7c760
2 changed files with 54 additions and 15 deletions

View file

@ -100,7 +100,7 @@
- _Depends: 1.2_
- _Boundary: CLI Tunables Component (main.c, myconf.h)_
- [ ] 6.2 Wire the tunables into `init_controller_tunables()`
- [x] 6.2 Wire the tunables into `init_controller_tunables()`
- Read the new `myconf_t` fields in `init_controller_tunables()`, falling back to the existing hardcoded default for any field left at 0 (unset)
- Observable: passing a tunable flag changes the corresponding controller tunable at startup; omitting all of them reproduces today's exact hardcoded values
- _Requirements: 6.2_

View file

@ -1014,8 +1014,13 @@ static void config_obj_killer(void* arg)
* Called early in cluster_init_phase1 so the values are available throughout
* the startup sequence (including pre-election and phase2).
*
* TODO: wire these to cluster_config fields once the config generation tool
* supports jobmgr/workermgr/qmgr/resmgr/xstrings (@13–@17).
* Req 6.2: each tunable is sourced from its CLI-set myconf_t field
* (--jobmgr-nhash etc., populated in main.c) when nonzero; a field left at
* 0 (unset) falls back to the hardcoded default below, so omitting all
* tunable flags reproduces today's exact values. The cluster_config
* @13–@17 fields this TODO used to reference were removed entirely by
* clusterconfig-schema-split Requirement 2 (they were already dead) and
* will never be wired — CLI flags are the sole configuration path now.
*/
/*
* cluster_init_managers: allocate and initialize the manager subsystems.
@ -1071,18 +1076,52 @@ static int cluster_init_managers(cluster_t *c)
static void init_controller_tunables(cluster_t *c)
{
/* Jobs can be numerous; workers/queues/resources are typically smaller.
* TODO: replace with config-driven values once the config generation tool
* supports cluster_config fields @13–@17 (jobmgr/workermgr/qmgr/resmgr/xstrings). */
c->tunables.jobmgr_nhash = 512;
c->tunables.jobmgr_delta = 128;
c->tunables.workermgr_nhash = 128;
c->tunables.workermgr_delta = 32;
c->tunables.qmgr_nhash = 128;
c->tunables.qmgr_delta = 32;
c->tunables.resmgr_nhash = 128;
c->tunables.resmgr_delta = 32;
c->tunables.resmgr_inst = 64;
c->tunables.xstrings_nhash = 512;
* Req 6.2: same 0-sentinel idiom as myconf->vcpus (myapp.c) — a nonzero
* CLI-set myconf_t value overrides the hardcoded default; 0 (unset)
* reproduces today's exact value. */
myconf_t *myconf = c->myconf;
c->tunables.jobmgr_nhash = (myconf->jobmgr_nhash > 0)
? myconf->jobmgr_nhash : 512;
c->tunables.jobmgr_delta = (myconf->jobmgr_delta > 0)
? myconf->jobmgr_delta : 128;
c->tunables.workermgr_nhash = (myconf->workermgr_nhash > 0)
? myconf->workermgr_nhash : 128;
c->tunables.workermgr_delta = (myconf->workermgr_delta > 0)
? myconf->workermgr_delta : 32;
c->tunables.qmgr_nhash = (myconf->qmgr_nhash > 0)
? myconf->qmgr_nhash : 128;
c->tunables.qmgr_delta = (myconf->qmgr_delta > 0)
? myconf->qmgr_delta : 32;
c->tunables.resmgr_nhash = (myconf->resmgr_nhash > 0)
? myconf->resmgr_nhash : 128;
c->tunables.resmgr_delta = (myconf->resmgr_delta > 0)
? myconf->resmgr_delta : 32;
/* resmgr_inst_delta (myconf/CLI name) maps by MEANING, not by name, to
* tunables.resmgr_inst (runtime field name) — both are the same
* zarray_init() growth-delta for c->sharedinst (confirmed: zarray_init's
* 2nd parameter is literally named `delta` in zarray.c). Do not rename
* tunables.resmgr_inst itself — out of scope, other readers unverified. */
c->tunables.resmgr_inst = (myconf->resmgr_inst_delta > 0)
? myconf->resmgr_inst_delta : 64;
c->tunables.xstrings_nhash = (myconf->xstrings_nhash > 0)
? myconf->xstrings_nhash : 512;
/* myconf->xstrings_delta (CLI: --xstrings-delta, added in task 6.1) is
* intentionally NOT wired to any c->tunables field: xstring_table_init()
* (src/lib/xstring.c) takes only an nslots parameter, and its backing
* store (kvtab_type, src/lib/kv.c) has no delta/growth-step concept at
* all -- each bucket entry is calloc'd individually, unlike the
* xkvmgr_type-backed jobmgr/workermgr/qmgr/resmgr tables which do grow
* by a configurable delta. Adding a tunables.xstrings_delta field would
* be dead: nothing could ever read it. WARN so the flag isn't a silent
* no-op for an operator who sets it. */
if (myconf->xstrings_delta > 0) {
WARN("--xstrings-delta=%u has no effect: the xstrings table has no "
"growth-delta dimension (xstring_table_init() takes only "
"nslots); use --xstrings-nhash instead",
myconf->xstrings_delta);
}
}
int cluster_init_phase1(cluster_t* c)