Skip to content

Multipath QUIC does not provide resolver-level failover under path failure #51

@anonuser201

Description

@anonuser201

Slipstream supports multiple resolvers and uses QUIC multipath. However, in practice, resolver-level failover does not occur when one resolver becomes unhealthy.

Reproduction:

slipstream-client \
  --tcp-listen-port 2052 \
  --resolver 1.1.1.1:53 \
  --resolver 8.8.8.8:53 \
  --domain ns.domain.tld

Observed behavior:
When the first resolver is consistently unhealthy, the client repeatedly retries the same resolver with exponential backoff:

 INFO Listening on TCP port 2052 (host ::)
 WARN Connection closed event=close state=picoquic_state_disconnected local_error=0x433 remote_error=0x0 local_app=0x0 remote_app=0x0 ready=false
 WARN Connection closed; reconnecting in 250ms
 WARN Path for resolver [::ffff:1.1.1.1]:53 became unavailable; resetting state
 WARN Connection closed event=close state=picoquic_state_disconnected local_error=0x433 remote_error=0x0 local_app=0x0 remote_app=0x0 ready=false
 WARN Connection closed; reconnecting in 500ms
 WARN Path for resolver [::ffff:1.1.1.1]:53 became unavailable; resetting state
 WARN Connection closed event=close state=picoquic_state_disconnected local_error=0x433 remote_error=0x0 local_app=0x0 remote_app=0x0 ready=false
 WARN Connection closed; reconnecting in 1000ms
 WARN Path for resolver [::ffff:1.1.1.1]:53 became unavailable; resetting state
 WARN Connection closed event=close state=picoquic_state_disconnected local_error=0x433 remote_error=0x0 local_app=0x0 remote_app=0x0 ready=false
 WARN Connection closed; reconnecting in 2000ms
 WARN Path for resolver [::ffff:1.1.1.1]:53 became unavailable; resetting state
(repeats)

The client never switches to the second resolver, even though it is configured and available.

slipstream-client \
  --tcp-listen-port 2052 \
  --resolver 8.8.8.8:53 \
  --resolver 1.1.1.1:53 \
  --domain ns.domain.tld
 INFO Listening on TCP port 2052 (host ::)
 INFO Connection ready
 INFO Added path [::ffff:1.1.1.1]:53
 WARN Path for resolver [::ffff:1.1.1.1]:53 became unavailable; resetting state
 WARN Failed adding path [::ffff:1.1.1.1]:53 (attempt 1), retrying in 250ms
 WARN Failed adding path [::ffff:1.1.1.1]:53 (attempt 2), retrying in 500ms
 INFO Added path [::ffff:1.1.1.1]:53
 WARN Path for resolver [::ffff:1.1.1.1]:53 became unavailable; resetting state
 WARN Failed adding path [::ffff:1.1.1.1]:53 (attempt 1), retrying in 250ms
 WARN Failed adding path [::ffff:1.1.1.1]:53 (attempt 2), retrying in 500ms
 INFO Added path [::ffff:1.1.1.1]:53
 WARN Path for resolver [::ffff:1.1.1.1]:53 became unavailable; resetting state
 WARN Failed adding path [::ffff:1.1.1.1]:53 (attempt 1), retrying in 250ms
 WARN Failed adding path [::ffff:1.1.1.1]:53 (attempt 2), retrying in 500ms
 INFO Added path [::ffff:1.1.1.1]:53
(repeats)

Expected behavior:
Once a resolver path is marked unavailable, the client should:

  • deprioritize or exclude it, and
  • attempt another configured resolver.

Notes:
This suggests that while multipath exists at the QUIC transport level, there is no resolver selection or failover policy at the client level. Multipath capability alone does not guarantee reliability without path health semantics (e.g., unhealthy exclusion, backoff with rotation).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions