From 3586c4a6a193258ea9c3db3092577df0065adb82 Mon Sep 17 00:00:00 2001 From: Easwar Swaminathan Date: Mon, 29 Nov 2021 14:13:21 -0800 Subject: [PATCH] internal/balancergroup: eliminate race in exitIdle --- internal/balancergroup/balancergroup.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/internal/balancergroup/balancergroup.go b/internal/balancergroup/balancergroup.go index 9776158dd98..6d977136b32 100644 --- a/internal/balancergroup/balancergroup.go +++ b/internal/balancergroup/balancergroup.go @@ -110,11 +110,7 @@ func (sbc *subBalancerWrapper) exitIdle() { ei.ExitIdle() return } - for sc, b := range sbc.group.scToSubBalancer { - if b == sbc { - sc.Connect() - } - } + sbc.group.connect(sbc) } func (sbc *subBalancerWrapper) updateSubConnState(sc balancer.SubConn, state balancer.SubConnState) { @@ -383,6 +379,17 @@ func (bg *BalancerGroup) cleanupSubConns(config *subBalancerWrapper) { bg.incomingMu.Unlock() } +// connect attempts to connect to all subConns belonging to sb. +func (bg *BalancerGroup) connect(sb *subBalancerWrapper) { + bg.incomingMu.Lock() + for sc, b := range bg.scToSubBalancer { + if b == sb { + sc.Connect() + } + } + bg.incomingMu.Unlock() +} + // Following are actions from the parent grpc.ClientConn, forward to sub-balancers. // UpdateSubConnState handles the state for the subconn. It finds the