Area: cache (Redis backend, #626)
After a failover behind a stable address, the Redis cache recovers by opening a new connection, since a connection lives at most one minute. rueidis dials that connection under the calling operation's context: mux.go, _pipe → wireFn(ctx), in v1.0.78. So the dial and handshake must fit inside the per-operation Timeout, which defaults to 100 ms.
The breaker's recovery probe runs under the same budget. If a fresh connect plus TLS handshake takes longer than Timeout, as it can across zones or with TLS, every probe times out. The cache then stays bypassed, and its owed invalidations stay pending, although the new primary is healthy.
Proposal: give the background probe a max(Timeout, DialTimeout) budget. Add a test in which a dial is slower than Timeout but faster than DialTimeout, and assert the breaker still closes.
#626 documents this as a caveat for now.
Area: cache (Redis backend, #626)
After a failover behind a stable address, the Redis cache recovers by opening a new connection, since a connection lives at most one minute. rueidis dials that connection under the calling operation's context:
mux.go,_pipe→wireFn(ctx), in v1.0.78. So the dial and handshake must fit inside the per-operationTimeout, which defaults to 100 ms.The breaker's recovery probe runs under the same budget. If a fresh connect plus TLS handshake takes longer than
Timeout, as it can across zones or with TLS, every probe times out. The cache then stays bypassed, and its owed invalidations stay pending, although the new primary is healthy.Proposal: give the background probe a
max(Timeout, DialTimeout)budget. Add a test in which a dial is slower thanTimeoutbut faster thanDialTimeout, and assert the breaker still closes.#626 documents this as a caveat for now.