func (bb *baseBalancer) HandleResolvedAddrs(addrs []resolver.Address, err error) {
	if err != nil {
		bb.lg.Warn("HandleResolvedAddrs called with error", zap.String("balancer-id", bb.id), zap.Error(err))
		return
	}
	bb.lg.Info("resolved", zap.String("balancer-id", bb.id), zap.Strings("addresses", addrsToStrings(addrs)))

	bb.mu.Lock()
	defer bb.mu.Unlock()

	resolved := make(map[resolver.Address]struct{})
	for _, addr := range addrs {
		resolved[addr] = struct{}{}
		if _, ok := bb.addrToSc[addr]; !ok {
			sc, err := bb.currentConn.NewSubConn([]resolver.Address{addr}, balancer.NewSubConnOptions{})
			if err != nil {
				bb.lg.Warn("NewSubConn failed", zap.String("balancer-id", bb.id), zap.Error(err), zap.String("address", addr.Addr))
				continue
			}
			bb.addrToSc[addr] = sc
			bb.scToAddr[sc] = addr
			bb.scToSt[sc] = connectivity.Idle
			sc.Connect()
		}
	}

	for addr, sc := range bb.addrToSc {
		if _, ok := resolved[addr]; !ok {
			// was removed by resolver or failed to create subconn
			bb.currentConn.RemoveSubConn(sc)
			delete(bb.addrToSc, addr)

			bb.lg.Info(
				"removed subconn",
				zap.String("balancer-id", bb.id),
				zap.String("address", addr.Addr),
				zap.String("subconn", scToString(sc)),
			)

			// Keep the state of this sc in bb.scToSt until sc's state becomes Shutdown.
			// The entry will be deleted in HandleSubConnStateChange.
			// (DO NOT) delete(bb.scToAddr, sc)
			// (DO NOT) delete(bb.scToSt, sc)
		}
	}
}
func (bb *baseBalancer) HandleResolvedAddrs(addrs []resolver.Address, err error) {
	if err != nil {
		bb.lg.Warn("HandleResolvedAddrs called with error", zap.String("balancer-id", bb.id), zap.Error(err))
		return
	}
	bb.lg.Info("resolved", zap.String("balancer-id", bb.id), zap.Strings("addresses", addrsToStrings(addrs)))

	bb.mu.Lock()
	defer bb.mu.Unlock()

	resolved := make(map[resolver.Address]struct{})
	for _, addr := range addrs {
		resolved[addr] = struct{}{}
		if _, ok := bb.addrToSc[addr]; !ok {
			sc, err := bb.currentConn.NewSubConn([]resolver.Address{addr}, balancer.NewSubConnOptions{})
			if err != nil {
				bb.lg.Warn("NewSubConn failed", zap.String("balancer-id", bb.id), zap.Error(err), zap.String("address", addr.Addr))
				continue
			}
			bb.addrToSc[addr] = sc
			bb.scToAddr[sc] = addr
			bb.scToSt[sc] = connectivity.Idle
			sc.Connect()
		}
	}

	for addr, sc := range bb.addrToSc {
		if _, ok := resolved[addr]; !ok {
			
			bb.currentConn.RemoveSubConn(sc)
			delete(bb.addrToSc, addr)

			bb.lg.Info(
				"removed subconn",
				zap.String("balancer-id", bb.id),
				zap.String("address", addr.Addr),
				zap.String("subconn", scToString(sc)),
			)

			
			
			
			
		}
	}
}
func ( bb * baseBalancer ) HandleResolvedAddrs ( addrs [ ] resolver . Address , err error ) { if err != nil { bb . lg . Warn ( " " , zap . String ( " " , bb . id ) , zap . Error ( err ) ) return } bb . lg . Info ( " " , zap . String ( " " , bb . id ) , zap . Strings ( " " , addrsToStrings ( addrs ) ) ) bb . mu . Lock ( ) defer bb . mu . Unlock ( ) resolved := make ( map [ resolver . Address ] struct { } ) for _ , addr := range addrs { resolved [ addr ] = struct { } { } if _ , ok := bb . addrToSc [ addr ] ; ! ok { sc , err := bb . currentConn . NewSubConn ( [ ] resolver . Address { addr } , balancer . NewSubConnOptions { } ) if err != nil { bb . lg . Warn ( " " , zap . String ( " " , bb . id ) , zap . Error ( err ) , zap . String ( " " , addr . Addr ) ) continue } bb . addrToSc [ addr ] = sc bb . scToAddr [ sc ] = addr bb . scToSt [ sc ] = connectivity . Idle sc . Connect ( ) } } for addr , sc := range bb . addrToSc { if _ , ok := resolved [ addr ] ; ! ok { // was removed by resolver or failed to create subconn bb . currentConn . RemoveSubConn ( sc ) delete ( bb . addrToSc , addr ) bb . lg . Info ( " " , zap . String ( " " , bb . id ) , zap . String ( " " , addr . Addr ) , zap . String ( " " , scToString ( sc ) ) , ) // Keep the state of this sc in bb.scToSt until sc's state becomes Shutdown. // The entry will be deleted in HandleSubConnStateChange. // (DO NOT) delete(bb.scToAddr, sc) // (DO NOT) delete(bb.scToSt, sc) } } }
// HandleResolvedAddrs implements "grpc/balancer.Balancer" interface.
// gRPC sends initial or updated resolved addresses from "Build".
HandleResolvedAddrs implements grpc / balancer . Balancer interface . gRPC sends initial or updated resolved addresses from Build .