diff --git a/broker/protocol/dispatcher.go b/broker/protocol/dispatcher.go index e6fb35ae..46d73e92 100644 --- a/broker/protocol/dispatcher.go +++ b/broker/protocol/dispatcher.go @@ -117,12 +117,19 @@ func (d *dispatcher) UpdateSubConnState(sc balancer.SubConn, state balancer.SubC panic("unexpected SubConn") } - if state.ConnectivityState == connectivity.Connecting && d.connState[sc] == connectivity.TransientFailure { + if (state.ConnectivityState == connectivity.Connecting || state.ConnectivityState == connectivity.Idle) && + d.connState[sc] == connectivity.TransientFailure { // gRPC will quickly transition failed connections back into a Connecting // state. In many cases, such as a remote-initiated close from a // shutting-down server, the SubConn may never return. Until we see a // successful re-connect, continue to consider the SubConn as broken // (and trigger invalidations of cached Routes which use it). + + if state.ConnectivityState == connectivity.Idle { + sc.Connect() + } + d.mu.Unlock() + return } else { d.connState[sc] = state.ConnectivityState } @@ -132,6 +139,10 @@ func (d *dispatcher) UpdateSubConnState(sc balancer.SubConn, state balancer.SubC delete(d.connID, sc) delete(d.connState, sc) } + + if state.ConnectivityState == connectivity.Idle { + sc.Connect() + } d.mu.Unlock() // Notify gRPC that block requests may now be able to proceed. diff --git a/go.mod b/go.mod index 40ff71fe..00b9bf49 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/mattn/go-sqlite3 v2.0.3+incompatible github.com/olekukonko/tablewriter v0.0.5 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.11.0 + github.com/prometheus/client_golang v1.11.1 github.com/prometheus/client_model v0.2.0 github.com/sirupsen/logrus v1.8.1 github.com/soheilhy/cmux v0.1.5 diff --git a/go.sum b/go.sum index 52383680..3fdeaad1 100644 --- a/go.sum +++ b/go.sum @@ -342,8 +342,9 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.11.1 h1:+4eQaD7vAZ6DsfsxB15hbE0odUjGI5ARs9yskGu1v4s= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=