Skip to content

NeverTimeout turns every slow peer into wedged-forever: subduction calls need a real bound #123

Description

@lannbot

The hazard

The engine's Timeout implementation for subduction calls is NeverTimeout (engine/guest/src/lib.rs ~:307-318): it literally returns Ok(fut.await) — no bound, ever. It is ours, not upstream.

This was a co-conspirator in the #113 stale-transport hang (fixed in #122): sync_with_peer walks a peer's connection list serially, and a call parked on a dead-but-unfailable transport wedged the sync forever — where a real bound would have made it a 30s stall with a diagnosis. The queue-closing fix in #122 removes that specific corpse, but NeverTimeout still converts every other "slow or silent peer" failure mode into "wedged forever":

  • a peer that is reachable but never answers (wedged remote engine, half-open path the transport layer never notices);
  • any future state-management bug of the same family — the class is "the await never resolves", and the timeout is the generic defense the engine currently opts out of.

What to decide (a measured decision, not a quick patch)

Gate sketch

The headless rebind-sync-check.ts idiom (demo/host/, just rebind-sync) extends naturally: a peer that accepts the wire and then goes silent (blackhole its relay path via the e2e severable proxy, or SIGSTOP a headless peer process) must produce a bounded, named sync outcome instead of a parked handle.

Context: #113 (the latch), #122 (the fix that flagged this), demo/e2e/scenarios/relay-partition.ts's wave-3 banner (the serial-walk-under-uncapped-timeout link).

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