Skip to content

A replaced writer can be re-dialled immediately: connect_random_peer takes no exclusion #307

Description

@MichaelTaylor3d

Task

When a corroboration round catches the writer contradicting a decisive quorum, dig-node now ends the session at once and dials a fresh peer (dig_ecosystem#2868). Nothing tells the dial which address it just rejected: connect_random_peer takes no exclusion argument, so the replacement may be the same contradicting peer.

Context

  • crates/dig-wallet/src/sage/sync_supervisor.rsChiaQuorumCorroborator::probe and the reconnect path; chia_query::peer::connect::connect_random_peer(network, tls, timeout).
  • The supervisor already documents the related bias: the helper tries 127.0.0.1 first and returns latency-first, so a host with a co-resident full node gets the same address every time.

Why it is not urgent

The existing backoff ladder bounds it. A refused session is far shorter than HEALTHY_SESSION, so backoff is not reset and doubles toward BACKOFF_MAX (60s) — a permanently contradicting local peer converges on one dial per minute rather than a dial loop. That is the property repeated_contradiction_climbs_the_existing_backoff pins.

Scope

An exclusion set (or at minimum a one-address avoid hint) threaded into the dial, so the peer that was just replaced is not the first candidate returned. Assess whether this belongs in chia-query (shared) or as a retry-with-reject loop in dig-node; the shared crate is release-first if so.

Evidence

A test showing a contradicting writer at address A is followed by a dial that is not A, while a network offering only A still degrades to the backoff ladder rather than a hang.

Orchestrator ticket: https://github.com/DIG-Network/dig_ecosystem/issues/2790

Moved from DIG-Network/dig_ecosystem#2873 so this repo's own PR can close it with Closes (CLAUDE.md §1.3).
GitHub refuses a private-to-public issue transfer, so the body was copied and comment history
stayed on the original.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions