mirror of
https://github.com/Joulenap/joulenap.git
synced 2026-08-11 13:21:43 +02:00
Two datastores on one box are two devices by design, but one power switch. The lease refcounted per device id, so a single sync route between them held two independent leases on one machine: releasing the first shut the box down, and releasing the second reached a machine already going down -- an SSL EOF from the idle check, then a closed port 22 -- and recorded LEFT_ON. The run's notification therefore warned "PBS left powered on" about a box that had gone to sleep exactly as intended. Acquire was already correct by accident, because _bring_up probes the host; only release, which never probes, was wrong. lease_key() is the host, normalised the way discovery normalises it, falling back to the device id when there is no host yet -- half-configured entries are legal mid-wizard and would otherwise all collide on "". state() takes the device rather than an id, and _pending_pbs_ids became _pending_pbs_keys: the queue's answer and the lease's key must be the same space, or a queued run on a box's other datastore stops holding it. Re-keying alone was not enough. A same-machine sync then acquired one lease twice and rendered "left on: still needed by another run" -- true only in the sense that the same run holds it, so one wrong sentence for another. A run's devices are now deduplicated by lease key: one machine, one wake, one power-off, and the multi-device step labels fall away on their own. Every device on a held machine now reports holders > 0, so the power button is disabled on the sibling too. That is the point: an SSH poweroff takes down every PBS instance on the box, including the one a run is using. Port is deliberately not part of the key for the same reason.