MCPcopy
hub / github.com/grpc/grpc-go / BalanceLoad

Method BalanceLoad

balancer/grpclb/grpclb_test.go:235–301  ·  view source on GitHub ↗
(stream lbgrpc.LoadBalancer_BalanceLoadServer)

Source from the content-addressed store, hash-verified

233}
234
235func (b *remoteBalancer) BalanceLoad(stream lbgrpc.LoadBalancer_BalanceLoadServer) error {
236 md, ok := metadata.FromIncomingContext(stream.Context())
237 if !ok {
238 return status.Error(codes.Internal, "failed to receive metadata")
239 }
240 if b.wantUserAgent != "" {
241 if ua := md["user-agent"]; len(ua) == 0 || !strings.HasPrefix(ua[0], b.wantUserAgent) {
242 return status.Errorf(codes.InvalidArgument, "received unexpected user-agent: %v, want prefix %q", ua, b.wantUserAgent)
243 }
244 }
245
246 req, err := stream.Recv()
247 if err != nil {
248 return err
249 }
250 initReq := req.GetInitialRequest()
251 if initReq.Name != b.wantServerName {
252 return status.Errorf(codes.InvalidArgument, "invalid service name: %q, want: %q", initReq.Name, b.wantServerName)
253 }
254 b.balanceLoadCh <- struct{}{}
255 resp := &lbpb.LoadBalanceResponse{
256 LoadBalanceResponseType: &lbpb.LoadBalanceResponse_InitialResponse{
257 InitialResponse: &lbpb.InitialLoadBalanceResponse{
258 ClientStatsReportInterval: &durationpb.Duration{
259 Seconds: int64(b.statsDura.Seconds()),
260 Nanos: int32(b.statsDura.Nanoseconds() - int64(b.statsDura.Seconds())*1e9),
261 },
262 },
263 },
264 }
265 if err := stream.Send(resp); err != nil {
266 return err
267 }
268 go func() {
269 for {
270 req, err := stream.Recv()
271 if err != nil {
272 return
273 }
274 b.stats.merge(req.GetClientStats())
275 if b.statsChan != nil && req.GetClientStats() != nil {
276 b.statsChan <- req.GetClientStats()
277 }
278 }
279 }()
280 for {
281 select {
282 case v := <-b.sls:
283 resp = &lbpb.LoadBalanceResponse{
284 LoadBalanceResponseType: &lbpb.LoadBalanceResponse_ServerList{
285 ServerList: v,
286 },
287 }
288 case <-b.fbChan:
289 resp = &lbpb.LoadBalanceResponse{
290 LoadBalanceResponseType: &lbpb.LoadBalanceResponse_FallbackResponse{
291 FallbackResponse: &lbpb.FallbackResponse{},
292 },

Callers

nothing calls this directly

Calls 11

FromIncomingContextFunction · 0.92
ErrorFunction · 0.92
ErrorfFunction · 0.92
GetInitialRequestMethod · 0.80
ErrMethod · 0.80
ContextMethod · 0.65
RecvMethod · 0.65
SendMethod · 0.65
GetClientStatsMethod · 0.65
mergeMethod · 0.45
DoneMethod · 0.45

Tested by

no test coverage detected