google.golang.org/grpc@v1.72.2/balancer/roundrobin/roundrobin.go (about) 1 /* 2 * 3 * Copyright 2017 gRPC authors. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 */ 18 19 // Package roundrobin defines a roundrobin balancer. Roundrobin balancer is 20 // installed as one of the default balancers in gRPC, users don't need to 21 // explicitly install this balancer. 22 package roundrobin 23 24 import ( 25 "fmt" 26 27 "google.golang.org/grpc/balancer" 28 "google.golang.org/grpc/balancer/endpointsharding" 29 "google.golang.org/grpc/balancer/pickfirst/pickfirstleaf" 30 "google.golang.org/grpc/grpclog" 31 internalgrpclog "google.golang.org/grpc/internal/grpclog" 32 ) 33 34 // Name is the name of round_robin balancer. 35 const Name = "round_robin" 36 37 var logger = grpclog.Component("roundrobin") 38 39 func init() { 40 balancer.Register(builder{}) 41 } 42 43 type builder struct{} 44 45 func (bb builder) Name() string { 46 return Name 47 } 48 49 func (bb builder) Build(cc balancer.ClientConn, opts balancer.BuildOptions) balancer.Balancer { 50 childBuilder := balancer.Get(pickfirstleaf.Name).Build 51 bal := &rrBalancer{ 52 cc: cc, 53 Balancer: endpointsharding.NewBalancer(cc, opts, childBuilder, endpointsharding.Options{}), 54 } 55 bal.logger = internalgrpclog.NewPrefixLogger(logger, fmt.Sprintf("[%p] ", bal)) 56 bal.logger.Infof("Created") 57 return bal 58 } 59 60 type rrBalancer struct { 61 balancer.Balancer 62 cc balancer.ClientConn 63 logger *internalgrpclog.PrefixLogger 64 } 65 66 func (b *rrBalancer) UpdateClientConnState(ccs balancer.ClientConnState) error { 67 return b.Balancer.UpdateClientConnState(balancer.ClientConnState{ 68 // Enable the health listener in pickfirst children for client side health 69 // checks and outlier detection, if configured. 70 ResolverState: pickfirstleaf.EnableHealthListener(ccs.ResolverState), 71 }) 72 } 73 74 func (b *rrBalancer) ExitIdle() { 75 // Should always be ok, as child is endpoint sharding. 76 if ei, ok := b.Balancer.(balancer.ExitIdler); ok { 77 ei.ExitIdle() 78 } 79 }