fix: set StateReady after temporary accept error retry

When Accept() returns a transient error, the service enters StateFailed,
sleeps for the retry delay, then loops back to Accept(). Previously the
state stayed StateFailed until the next successful Accept() — which
could take arbitrarily long for idle services, making status observers
see a stale 'error' even though the service has already reconnected
and is ready.

Now set StateReady (and clear lastError) immediately after the retry
sleep. Accept will block until the next connection, but the state
correctly reflects that the service is functional.
This commit is contained in:
ginuerzh
2026-06-17 21:28:31 +08:00
parent 81dc9331b8
commit c5b62d41ae
+8
View File
@@ -227,6 +227,14 @@ func (s *defaultService) Serve() error {
log.Warnf("accept: %v, retrying in %v", e, tempDelay)
time.Sleep(tempDelay)
// Transition back to Ready so status observers see the
// recovered service immediately, instead of waiting for
// the next successful Accept (which may block arbitrarily).
if s.status.State() == StateFailed {
s.setState(StateReady)
s.status.setLastError(nil)
}
continue
}
s.setState(StateClosed)