Ensure that RoundRobin.Close() does not panic. (#1139)
diff --git a/balancer.go b/balancer.go
index 9d943fb..44db931 100644
--- a/balancer.go
+++ b/balancer.go
@@ -385,6 +385,9 @@
func (rr *roundRobin) Close() error {
rr.mu.Lock()
defer rr.mu.Unlock()
+ if rr.done {
+ return errBalancerClosed
+ }
rr.done = true
if rr.w != nil {
rr.w.Close()
diff --git a/clientconn.go b/clientconn.go
index 434cab4..41a5293 100644
--- a/clientconn.go
+++ b/clientconn.go
@@ -78,6 +78,8 @@
errConnClosing = errors.New("grpc: the connection is closing")
// errConnUnavailable indicates that the connection is unavailable.
errConnUnavailable = errors.New("grpc: the connection is unavailable")
+ // errBalancerClosed indicates that the balancer is closed.
+ errBalancerClosed = errors.New("grpc: balancer is closed")
// minimum time to give a connection to complete
minConnectTimeout = 20 * time.Second
)