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).
Slipstream supports multiple resolvers and uses QUIC multipath. However, in practice, resolver-level failover does not occur when one resolver becomes unhealthy.
Reproduction:
Observed behavior:
When the first resolver is consistently unhealthy, the client repeatedly retries the same resolver with exponential backoff:
The client never switches to the second resolver, even though it is configured and available.
Expected behavior:
Once a resolver path is marked unavailable, the client should:
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).