sendNewPickerLocked pushes a new picker on to the channel. Note that regardless of what connectivity state is reported, the policy will return its own picker, and not a picker that unconditionally queues (typically used for IDLE or CONNECTING) or a picker that unconditionally fails (typically used
()
| 525 | // |
| 526 | // Caller must hold lb.stateMu. |
| 527 | func (b *rlsBalancer) sendNewPickerLocked() { |
| 528 | aggregatedState := b.aggregatedConnectivityState() |
| 529 | |
| 530 | // Acquire a separate reference for the picker. This is required to ensure |
| 531 | // that the wrapper held by the old picker is not closed when the default |
| 532 | // target changes in the config, and a new wrapper is created for the new |
| 533 | // default target. See handleChildPolicyConfigUpdate() for how config changes |
| 534 | // affecting the default target are handled. |
| 535 | if b.defaultPolicy != nil { |
| 536 | b.defaultPolicy.acquireRef() |
| 537 | } |
| 538 | |
| 539 | picker := &rlsPicker{ |
| 540 | kbm: b.lbCfg.kbMap, |
| 541 | origEndpoint: b.bopts.Target.Endpoint(), |
| 542 | lb: b, |
| 543 | defaultPolicy: b.defaultPolicy, |
| 544 | ctrlCh: b.ctrlCh, |
| 545 | maxAge: b.lbCfg.maxAge, |
| 546 | staleAge: b.lbCfg.staleAge, |
| 547 | bg: b.bg, |
| 548 | rlsServerTarget: b.lbCfg.lookupService, |
| 549 | grpcTarget: b.bopts.Target.String(), |
| 550 | metricsRecorder: b.cc.MetricsRecorder(), |
| 551 | } |
| 552 | picker.logger = internalgrpclog.NewPrefixLogger(logger, fmt.Sprintf("[rls-picker %p] ", picker)) |
| 553 | state := balancer.State{ |
| 554 | ConnectivityState: aggregatedState, |
| 555 | Picker: picker, |
| 556 | } |
| 557 | |
| 558 | if !b.inhibitPickerUpdates { |
| 559 | b.logger.Infof("New balancer.State: %+v", state) |
| 560 | b.cc.UpdateState(state) |
| 561 | } else { |
| 562 | b.logger.Infof("Delaying picker update: %+v", state) |
| 563 | } |
| 564 | |
| 565 | if b.lastPicker != nil { |
| 566 | if b.defaultPolicy != nil { |
| 567 | b.defaultPolicy.releaseRef() |
| 568 | } |
| 569 | } |
| 570 | b.lastPicker = picker |
| 571 | } |
| 572 | |
| 573 | func (b *rlsBalancer) sendNewPicker() { |
| 574 | b.stateMu.Lock() |
no test coverage detected