(stream lbgrpc.LoadBalancer_BalanceLoadServer)
| 233 | } |
| 234 | |
| 235 | func (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 | }, |
nothing calls this directly
no test coverage detected