Skip to content

feat(app): wrap duty callbacks with the retry executor #534

Description

@emlautarom1-agent

Part of #402 — follow-up to the app-wiring PR. Pairs with the scheduler Lagged issue.

Scope

Wrap the duty-pipeline callbacks with the retry executor. Charon wraps five callbacks with retry.New(deadlineFunc) / WithAsyncRetry (app/app.go:646-647 at v1.7.1): fetcher.Fetch, consensus.Participate, consensus.Propose, parsigex.Broadcast, bcast.Broadcast. Pluto's executor (crates/app/src/retry.rs, a faithful port of Charon app/retry) currently has zero call sites — add the inline wrapper layer in crates/app/src/node/wire.rs.

Without it, a single transient beacon-node/network error drops that duty on this node (threshold peers still complete it, so the cluster degrades gracefully — which is why this was deferred from the app-wiring PR). Wrapping also restores Charon's async duty-callback semantics: subscribers currently process duties serially, which is what makes the scheduler Lagged failure mode reachable.

Dependencies

None.

Acceptance

  • The five callbacks are wrapped with per-duty deadlines from the beacon-derived deadline function.
  • Wiring test: a transient beacon error on fetcher.fetch is retried and the duty completes.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestrustPull requests that update rust codetrack:orchestration-cliDev C — orchestration + CLI

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions