feat(app): wrap duty callbacks with the retry executor - #688
Open
varex83agent wants to merge 1 commit into
Open
Conversation
Closes #534. Co-Authored-By: Bohdan Ohorodnii <35969035+varex83@users.noreply.github.com>
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.
Closes #534.
Wires Pluto's async retry executor (
crates/app/src/retry.rs, previously with zero call sites) into the five duty-pipeline callbacks charon wraps incore.WithAsyncRetry(core/retry.go, applied inapp/app.goascore.WithAsyncRetry(retry.New(deadlineFunc))at v1.7.1):fetcher.fetch,consensus.participate,consensus.propose,parsigex.broadcastandbcast.broadcast. Each stitch now dispatches its work onto the executor with a per-duty deadline from the beacon-derived deadline calculator and returns immediately, so a transient beacon-node or network error is retried with backoff instead of dropping the duty on this node.Consensus is wrapped for async dispatch only (no retry), matching charon's note that
ConsensusParticipate/ConsensusPropose"don't require retrying but they should be called async" — re-running a failed QBFT instance for the same duty would be wrong. Because Pluto's generated beacon client collapses non-2xx responses into message-less typed errors, charon'sisTemporaryBeaconErrsubstring heuristic cannot be ported verbatim; the retry decision is fixed per call site instead and documented inline as an accepted divergence.Adds the wiring test the issue asks for: a transient 503 on the attestation-data endpoint is retried and the attester duty still completes through to
consensus.propose(verified to fail when the retry policy is removed).Co-Authored-By: Bohdan Ohorodnii 35969035+varex83@users.noreply.github.com