Skip to content

Commit

Permalink
clientconn: go idle if conn closed after preface received
Browse files Browse the repository at this point in the history
The select branch will be selected randomly, if there are several ready
branches. If the preface has been received and then connection is
closed, the `createTransport` might hit the `connClosed.Done()` branch.
Ideally, the subConn should go idle and reconnect.

Fixes: #5688

Signed-off-by: Wei Fu <fuweid89@gmail.com>
  • Loading branch information
fuweid committed Oct 12, 2022
1 parent e81d0a2 commit 16265fb
Showing 1 changed file with 7 additions and 1 deletion.
8 changes: 7 additions & 1 deletion clientconn.go
Expand Up @@ -1325,9 +1325,15 @@ func (ac *addrConn) createTransport(addr resolver.Address, copts transport.Conne
return nil
case <-connClosed.Done():
// The transport has already closed. If we received the preface, too,
// this is not an error.
// this is not an error and go idle.
select {
case <-prefaceReceived.Done():
ac.mu.Lock()
defer ac.mu.Unlock()

if ac.state != connectivity.Shutdown {
ac.updateConnectivityState(connectivity.Idle, nil)
}
return nil
default:
return errors.New("connection closed before server preface received")
Expand Down

0 comments on commit 16265fb

Please sign in to comment.