xce-node-manager: a "Cross-Spec Interactions" section (pending a requirements revision; approved criteria unchanged) with six points: a supervision/probe module shared with service-supervision, node-manager components vs service jobs, a lease-based provisioner role, role declaration and worker stop on decommission for provisioned hosts, a host-loss grace period longer than worker restart plus rejoin, and a future service proxy under the reverse-proxy role. design.md Open Questions points to it. The service-supervision, host-failure-job-recovery, elastic-hosts, resource-provisioner and service-endpoint briefs cross-reference the matching points; the roadmap lists the xce-node-manager revision. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
4.9 KiB
Brief: service-supervision
(/kiro-discovery, 2026-10-10, "Long-running services" phase 1.)
Problem
Users and admins want to run long-lived services on XCE next to batch work: model servers, notebooks, databases and web apps for users; license servers, workflow engines and monitoring agents for admins. Today a job that exits or hangs simply ends or keeps running unnoticed: nothing restarts it and nothing checks that it still works.
Current State
- A job runs in a systemd transient unit
xcecd-worker-<jobid>with noRestart=(src/worker/src/xcecd_cgroups.c); thexcecd_workerprocess forks the job and reports its exit (xcecd_worker.c:467-523); the controller ends it DONE or EXIT (job.c:2937-2951). - No health, liveness or readiness checks exist.
- Nothing kills an indefinitely running job unless the user sets
-W(RuntimeMaxUSeconly when > 0), so running forever already works. - A running job writes a usage WAL record every 10 s; checkpoints keep the WAL bounded (no growth with job age).
Desired Outcome
- An application profile can declare kind
servicewith:- a restart policy:
always/on-failure/never, backoff (initial, maximum), and a give-up rule (max restarts in a window); - a liveness probe: command, TCP connect or HTTP GET, with interval, timeout, failure threshold and initial delay;
- a readiness probe (same forms), reported but not yet used for routing
(
service-endpoint); - whether the service is rerunnable after host loss (default yes,
host-failure-job-recovery).
- a restart policy:
- The worker supervises each service task on its host: runs the probes locally, restarts the process in place on exit or failed liveness (keeping its allocation), applies backoff, and gives up per policy (the job then ends EXIT with the reason, or is requeued if the policy says so).
- The worker reports only changes to the controller: ready / not ready,
restarted (count, last reason), gave up. Users see state, restart count
and last failure in job details and
xcecli. - Stopping a service is the normal job kill; a service never ends DONE on
its own unless its policy is
neverand it exits 0. - Service jobs are excluded from no-op expectations of batch jobs: no run limit by default, not cleaned up while running.
Approach
Supervision lives in xcecd_worker (already the job's parent): a restart
loop around the launch with backoff, probe timers on the worker's event
loop, and change-only status reports over the existing worker→controller
channel. The profile's service section flows to the worker through the job's
effective values (job-config-merge). Using systemd Restart= was
considered and rejected for v1: it would rerun xcecd_worker itself
(including profile pre-exec) and hide restarts from XCE.
Scope
- In: profile service section (kind, restart policy, probes, rerunnable);
worker restart loop and probes; change-only health reports and their
persistence; display (state, restarts, last failure); xcecli/REST
submission of service jobs through profiles; tests incl.
xcecd_virtualsimulation of probes and restarts. - Out: replicas, scaling, replacement on other hosts, rolling update
(
service-replica-set); endpoints and ports (service-endpoint); host failure (host-failure-job-recovery).
Boundary Candidates
- Profile schema for services (with
application-profile). - Worker supervision loop and probe runner.
- Health/restart reporting and persistence (controller).
- Display surfaces.
Out of Boundary
- Any decision that needs a cluster-wide view (more replicas, new hosts).
- No replica is special: every replica's own worker checks it (user decision 2026-10-10), so there is no head and no promotion.
Upstream / Downstream
- Upstream:
application-profile,job-config-merge(effective values),host-failure-job-recovery(host loss), worker launch path. - Downstream:
service-replica-set(replaces replicas that gave up, gates rollouts on readiness),service-endpoint(readiness).
Existing Spec Touchpoints
- Extends:
application-profile(service section of the profile). - Adjacent:
job-sandbox-execution(execution backends must support the restart loop),controller-job-cleanup,xce-node-manager(supervises XCE's own daemons; never job processes). Restart policy, backoff, give-up and probes (incl. the Node Manager's TCP port check) should come from one shared supervision/probe module so both layers behave the same (xce-node-managerrequirements.md, "Cross-Spec Interactions" 1). Infrastructure services that XCE does not need to run itself are service jobs, not Node Manager roles (ibid. 2).
Constraints
- Health reports must be change-only (no per-probe WAL traffic).
- Real
xcecdneeds systemd/dbus to verify;xcecd_virtualmust simulate probe outcomes and restarts for CI. - Persistence of health state: field completeness (
persistence.md).