Skip to content

feat(playbooks): add single-node blackout & recovery playbook#218

Open
parithosh wants to merge 2 commits into
masterfrom
pk/single-node-blackout-recovery-playbook
Open

feat(playbooks): add single-node blackout & recovery playbook#218
parithosh wants to merge 2 commits into
masterfrom
pk/single-node-blackout-recovery-playbook

Conversation

@parithosh

Copy link
Copy Markdown
Member

What

Adds playbooks/dev/single-node-blackout-recovery.yaml: fully isolates one participant's beacon node from the devnet through the disruptoor HTTP API, keeps the blackout active for a configurable number of slots, heals it, then verifies the node re-syncs and the network regains fresh finality.

"Fully" means the target beacon node loses all traffic — p2p and control traffic to every other participant and to its own execution + validator client (scope [cl_p2p, el_p2p, include_control]). Because disruptoor rejects overlapping partition groups, this is expressed as two partitions that both pit the target CL against a disjoint counterparty group.

Complements two-way-network-split-reorg-trigger.yaml: instead of a two-half split, this reproduces sudden total network loss of a single node — e.g. client stall/recovery behaviour on post-fork devnets (the blackout is gated on minStartEpoch so fork-activation devnets can schedule it after the fork).

Config knobs

  • targetParticipantIndex — 1-based node-index of the participant whose CL gets blacked out
  • blackoutDurationSlots — slots to hold the blackout (default 5 ≈ 30s on minimal preset)
  • minStartEpoch — earliest epoch for the blackout (set ≥ fork epoch + 2 on fork devnets)
  • disruptoorApiUrl, minimumClientCount, recovery-finality thresholds

Testing

Ran end-to-end on a 4-node glamsterdam-devnet-7 kurtosis devnet (lighthouse/ethrex, teku/nethermind, lodestar/nethermind, prysm/ethrex) with gloas_fork_epoch: 1, targeting the prysm node: all 13 tasks pass — blackout applied (verified via disruptoor state + iptables rule logs + the target head stalling), healed after 5 slots, target re-synced, fresh finality confirmed. Cleanup task heals the network if the test aborts mid-blackout.

🤖 Generated with Claude Code

parithosh and others added 2 commits July 13, 2026 15:47
Fully isolates one participant's beacon node via the disruptoor HTTP API
(p2p + control traffic to all other participants and to its own EL/VC),
holds the blackout for a configurable number of slots, heals, then
verifies re-sync and fresh finality.

Complements two-way-network-split-reorg-trigger: instead of a two-half
split this reproduces total single-node network loss, e.g. for testing
client stall/recovery behaviour after a fork.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…t expression

Inside map(select(...)) jq rebinds . to the array element, so
.targetParticipantIndex resolved against a number and errored (assertoor
marshals gojq errors to {}). Bind it to $target at the root first.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant