mirror of
https://github.com/xcat2/xcat-core.git
synced 2026-09-05 04:27:55 +00:00
49b0c26efb
The backoff that decides when to re-fork the install monitor is arithmetic over a handful of counters, but it lives inline in xcatd among the daemon's globals, its signal handlers and its fork. xcatd needs the database, SSL, the plugin tree and /var/run/xcat before it will run, so nothing in a unit test can execute that arithmetic; a test can only match patterns against the script's source and hope the shape it finds behaves. That is how a retry budget which ran out and could never be refilled passed a green test run. Move the pacing to xCAT::RespawnUtils as pure functions: each takes the current state and the current time and returns the next state, reading no clock, no globals and no files. Passing the time in is what makes the schedule checkable over a virtual clock instead of in real seconds, and returning a new state rather than mutating one is what makes it safe to call from the SIGCHLD handler -- the result is built before the caller installs it, so a signal arriving partway through cannot leave the pacing half-updated. The behaviour is unchanged from the previous commit and stays covered by xCAT-test/unit/xcatd_monitor_respawn.t, which now executes these functions instead of grepping for them: the delay doubles from XCATD_MON_RESPAWN_MIN_INTERVAL (5s) to XCATD_MON_RESPAWN_MAX_INTERVAL (300s) and holds there without ever refusing a retry, and a monitor that stayed up XCATD_MON_RESPAWN_HEALTHY seconds (60s) resets the backoff when it later dies. policy() now also refuses a floor below one second, which would double to itself and give a fork storm rather than a backoff, and a ceiling under the floor. Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>