fix(upgrade): quiesce rejected bindings before rollback - #74
Merged
Conversation
Member
Author
|
Landed via squash merge as |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
when the target reused an existing named runtime and mutated no runtime tree
node_modules/openclawpeer links after source-state restorationretained/missing/rejected links, restored service binding, and gateway RPC
readiness
Root cause
rollback_upgrade_lockedquiesced only when runtime bytes had changed. A switchto an already-installed named runtime changes the published binding without
adding
mutated_runtime_names, so a rejected target in supervisor backoff couldremain able to mutate the environment while OCM restored the source snapshot.
Whole-root snapshot restoration already preserves these symlinks in a cold
fixture. A post-rollback repair phase would therefore be downstream and still
racy. The owner invariant is process exclusion: quiesce whenever rollback
changes runtime bytes or the active binding, before restoring source-owned
state.
Evidence
Base:
6a30e9063bcf85d1cba4c1c358ce6140e70fcf40Head:
f63f41af1638a3c03a6f6826d908b128f89d13ceOn unmodified canonical source, the active-service fixture completed rollback
with
clickclack/node_modules/openclawresolving to rejected runtime2026.8.2instead of restored runtime2026.8.1.On this head, the same fixture reports:
The fixture verifies
clickclack,codex,discord, andllama-cpp; exactraw and resolved peer-link targets; one retained valid link; one removed link;
two rejected-runtime links; restored service binding; and deep gateway RPC
readiness. It does not configure real channels, so no channel-health claim is
made.
Validation
cargo test --locked -- --test-threads=1cargo clippy --workspace --all-targets --all-features --locked -- -D warnings -A clippy::question_mark -A clippy::large_enum_variant -A clippy::too_many_argumentscargo +1.88.0 check --workspace --all-targets --lockedcargo fmt --all -- --checkPRs #71, #72, and #73 and current
mainwere checked before implementation.This change does not add OpenClaw convergence retries or invoke a manual repair
command.