Repository navigation
feat(seinode): wake drift-deferred nodes when a roll slot frees (spec 012 Req 1.5) - #606
Conversation
… 012 Req 1.5) A drifted node that waits for a roll slot re-checked only on its 30-second status poll. A watch on SeiNode now enqueues every UpdateDeferred node in the namespace when a node leaves NodeUpdateInProgress=True or is deleted, so the next node in slot order starts without waiting out the poll. Refs PLT-1399. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR SummaryMedium Risk Overview Slot math, order, and pinning are unchanged; only when waiting nodes re-run the slot check changes. Unit tests cover the predicate and peer mapping in Reviewed by Cursor Bugbot for commit e8f19bb. Bugbot is set up for automated code reviews on this repo. Configure here. |
|
@seidroid review |
There was a problem hiding this comment.
Nothing material has changed since the last review: the diff matches it byte for byte (275 lines), the merge tree is still at 51215cf, and the PR description is the same, so the change still wakes UpdateDeferred peers when a slot holder leaves NodeUpdateInProgress=True or is deleted, nothing blocks, and the earlier non-blocker on pause and phase changes still stands. The one other reading (codex) again found nothing, which agrees with this review apart from that non-blocker, so it added nothing to keep or drop.
Non-blocking
DriftSlotalso frees a slot when a holder is paused or leavesPhaseRunning, because either drops it fromupdating, and the slot count changes as nodes enter or leave Running.slotReleaseddoes not fire for any of these, so a deferred node still waits for its 30s poll in those cases. Either add this to spec 012's Known limits or widen the predicate.
seidroid review · decision approve · session 424d7184ba744a2cbd759b8616d4e1c3 · turn resp_claude_defe8d79c35197cf25835a3753f47bc7 · item 20f0323b6ddb5e79a0ee94116c4070f7
Findings: 0 blocking | 1 non-blocking | 0 posted inline
… changes phase Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@seidroid review |
There was a problem hiding this comment.
This revision widens slotReleased to also fire when spec.paused flips or status.phase changes, and adds test cases and spec text for both, so every event that can free or add a slot in DriftSlot now wakes the UpdateDeferred peers; that addresses my earlier non-blocker. Nothing blocks on the merge tree (b2e53e1), though the tests were not run because no Go toolchain was available, and the other reading (codex) again found nothing, which agrees with this review, so it contributed nothing to keep or drop.
seidroid review · decision approve · session 424d7184ba744a2cbd759b8616d4e1c3 · turn resp_claude_348c75c5a9114cba4f61d96c2356ab23 · item 08886ed4fe4e5c9c955f21664a3d2703
Findings: 0 blocking | 0 non-blocking | 0 posted inline
Summary
Closes the last PLT-1399 acceptance criterion: a deferred node starts within one requeue interval after a slot frees.
A drifted node that waits for a roll slot re-checked only on its 30-second status poll. The node controller also reconciles one node at a time, so the wait was the poll plus the queue. In the 2026-10-08 rollout of
cff50d3, the measured wait from a freed slot to the next start was:Change
slotReleasedpasses a SeiNode event that can free or add a slot: the node leavesNodeUpdateInProgress=True, itsspec.pausedflips, its phase changes (the slot count counts Running, unpaused nodes), or it is deleted.deferredPeersmaps that event to every node in the namespace whoseNodeUpdateInProgressreason isUpdateDeferred. Each woken node runs the slot decision again with the existing uncached read, so a stale cache costs at most one extra reconcile.planner.ReasonUpdateDeferredis now exported, so the node controller can match it.The change does not alter the slot decision, the order, or the pin. It only changes when a waiting node re-checks.
Verification
TestSlotReleased: completion, failure, pause, a phase change, and deletion wake; start, steady state, and creation do not.TestDeferredPeers: onlyUpdateDeferrednodes in the same namespace are woken.go test ./internal/... ./cmd/...passes (with envtest).golangci-lint --new-from-merge-base=origin/mainreports 0 issues.go vetpasses.After the merge, the rollout is a controller-only bump: the cell sidecar does not change, so no node pod rolls.
Refs PLT-1399.
🤖 Generated with Claude Code