50 class ForwardingLoadBalancingPolicy :
public LoadBalancingPolicy {
52 ForwardingLoadBalancingPolicy(
53 std::unique_ptr<ChannelControlHelper> delegating_helper,
Args args,
54 const char* delegate_policy_name,
intptr_t initial_refcount = 1)
55 : LoadBalancingPolicy(
std::
move(
args), initial_refcount) {
57 delegate_args.work_serializer = work_serializer();
58 delegate_args.channel_control_helper =
std::move(delegating_helper);
59 delegate_args.args =
args.args;
61 delegate_policy_name,
std::move(delegate_args));
63 interested_parties());
66 ~ForwardingLoadBalancingPolicy()
override =
default;
68 void UpdateLocked(UpdateArgs
args)
override {
74 void ResetBackoffLocked()
override {
delegate_->ResetBackoffLocked(); }
77 void ShutdownLocked()
override {
delegate_.reset(); }
86 constexpr
char kTestPickArgsLbPolicyName[] =
"test_pick_args_lb";
88 class TestPickArgsLb :
public ForwardingLoadBalancingPolicy {
91 const char* delegate_policy_name)
92 : ForwardingLoadBalancingPolicy(
93 absl::make_unique<Helper>(RefCountedPtr<TestPickArgsLb>(
this),
cb),
97 ~TestPickArgsLb()
override =
default;
99 const char*
name()
const override {
return kTestPickArgsLbPolicyName; }
102 class Picker :
public SubchannelPicker {
104 Picker(std::unique_ptr<SubchannelPicker> delegate_picker,
108 PickResult Pick(PickArgs
args)
override {
110 PickArgsSeen args_seen;
112 args_seen.metadata =
args.initial_metadata->TestOnlyCopyToVector();
123 class Helper :
public ChannelControlHelper {
128 RefCountedPtr<SubchannelInterface> CreateSubchannel(
130 return parent_->channel_control_helper()->CreateSubchannel(
135 std::unique_ptr<SubchannelPicker> picker)
override {
136 parent_->channel_control_helper()->UpdateState(
140 void RequestReresolution()
override {
141 parent_->channel_control_helper()->RequestReresolution();
145 return parent_->channel_control_helper()->GetAuthority();
148 void AddTraceEvent(TraceSeverity
severity,
161 const char*
name()
const override {
return kTestPickArgsLbPolicyName; }
164 class TestPickArgsLbFactory :
public LoadBalancingPolicyFactory {
167 const char* delegate_policy_name)
170 OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
176 const char*
name()
const override {
return kTestPickArgsLbPolicyName; }
178 RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
180 return MakeRefCounted<TestPickArgsLbConfig>();
192 constexpr
char kInterceptRecvTrailingMetadataLbPolicyName[] =
193 "intercept_trailing_metadata_lb";
195 class InterceptRecvTrailingMetadataLoadBalancingPolicy
196 :
public ForwardingLoadBalancingPolicy {
198 InterceptRecvTrailingMetadataLoadBalancingPolicy(
200 : ForwardingLoadBalancingPolicy(
201 absl::make_unique<Helper>(
202 RefCountedPtr<InterceptRecvTrailingMetadataLoadBalancingPolicy>(
209 ~InterceptRecvTrailingMetadataLoadBalancingPolicy()
override =
default;
211 const char*
name()
const override {
212 return kInterceptRecvTrailingMetadataLbPolicyName;
216 class Picker :
public SubchannelPicker {
218 Picker(std::unique_ptr<SubchannelPicker> delegate_picker,
222 PickResult Pick(PickArgs
args)
override {
226 auto* complete_pick = absl::get_if<PickResult::Complete>(&
result.result);
227 if (complete_pick !=
nullptr) {
228 complete_pick->subchannel_call_tracker =
229 absl::make_unique<SubchannelCallTracker>(
cb_);
239 class Helper :
public ChannelControlHelper {
242 RefCountedPtr<InterceptRecvTrailingMetadataLoadBalancingPolicy> parent,
246 RefCountedPtr<SubchannelInterface> CreateSubchannel(
248 return parent_->channel_control_helper()->CreateSubchannel(
253 std::unique_ptr<SubchannelPicker> picker)
override {
254 parent_->channel_control_helper()->UpdateState(
258 void RequestReresolution()
override {
259 parent_->channel_control_helper()->RequestReresolution();
263 return parent_->channel_control_helper()->GetAuthority();
266 void AddTraceEvent(TraceSeverity
severity,
272 RefCountedPtr<InterceptRecvTrailingMetadataLoadBalancingPolicy>
parent_;
276 class SubchannelCallTracker :
public SubchannelCallTrackerInterface {
281 void Start()
override {}
284 TrailingMetadataArgsSeen args_seen;
285 args_seen.status =
args.status;
286 args_seen.backend_metric_data =
287 args.backend_metric_accessor->GetBackendMetricData();
288 args_seen.metadata =
args.trailing_metadata->TestOnlyCopyToVector();
299 const char*
name()
const override {
300 return kInterceptRecvTrailingMetadataLbPolicyName;
304 class InterceptTrailingFactory :
public LoadBalancingPolicyFactory {
309 OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
311 return MakeOrphanable<InterceptRecvTrailingMetadataLoadBalancingPolicy>(
315 const char*
name()
const override {
316 return kInterceptRecvTrailingMetadataLbPolicyName;
319 RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
321 return MakeRefCounted<InterceptTrailingConfig>();
332 constexpr
char kAddressTestLbPolicyName[] =
"address_test_lb";
334 class AddressTestLoadBalancingPolicy :
public ForwardingLoadBalancingPolicy {
337 : ForwardingLoadBalancingPolicy(
339 RefCountedPtr<AddressTestLoadBalancingPolicy>(this),
345 ~AddressTestLoadBalancingPolicy()
override =
default;
347 const char*
name()
const override {
return kAddressTestLbPolicyName; }
350 class Helper :
public ChannelControlHelper {
352 Helper(RefCountedPtr<AddressTestLoadBalancingPolicy> parent,
356 RefCountedPtr<SubchannelInterface> CreateSubchannel(
359 return parent_->channel_control_helper()->CreateSubchannel(
364 std::unique_ptr<SubchannelPicker> picker)
override {
369 void RequestReresolution()
override {
370 parent_->channel_control_helper()->RequestReresolution();
374 return parent_->channel_control_helper()->GetAuthority();
377 void AddTraceEvent(TraceSeverity
severity,
383 RefCountedPtr<AddressTestLoadBalancingPolicy>
parent_;
390 const char*
name()
const override {
return kAddressTestLbPolicyName; }
393 class AddressTestFactory :
public LoadBalancingPolicyFactory {
397 OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
399 return MakeOrphanable<AddressTestLoadBalancingPolicy>(
std::move(
args),
cb_);
402 const char*
name()
const override {
return kAddressTestLbPolicyName; }
404 RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
406 return MakeRefCounted<AddressTestConfig>();
417 constexpr
char kFixedAddressLbPolicyName[] =
"fixed_address_lb";
424 const char*
name()
const override {
return kFixedAddressLbPolicyName; }
432 class FixedAddressLoadBalancingPolicy :
public ForwardingLoadBalancingPolicy {
434 explicit FixedAddressLoadBalancingPolicy(
Args args)
435 : ForwardingLoadBalancingPolicy(
436 absl::make_unique<Helper>(
437 RefCountedPtr<FixedAddressLoadBalancingPolicy>(
this)),
442 ~FixedAddressLoadBalancingPolicy()
override =
default;
444 const char*
name()
const override {
return kFixedAddressLbPolicyName; }
446 void UpdateLocked(UpdateArgs
args)
override {
447 auto*
config =
static_cast<FixedAddressConfig*
>(
args.config.get());
449 config->address().c_str());
456 args.addresses->emplace_back(address,
nullptr);
459 "%s: could not parse URI (%s), using empty address list",
460 kFixedAddressLbPolicyName, uri.status().ToString().c_str());
461 args.resolution_note =
"no address in fixed_address_lb policy";
463 ForwardingLoadBalancingPolicy::UpdateLocked(
std::move(
args));
467 class Helper :
public ChannelControlHelper {
469 explicit Helper(RefCountedPtr<FixedAddressLoadBalancingPolicy> parent)
472 RefCountedPtr<SubchannelInterface> CreateSubchannel(
474 return parent_->channel_control_helper()->CreateSubchannel(
479 std::unique_ptr<SubchannelPicker> picker)
override {
484 void RequestReresolution()
override {
485 parent_->channel_control_helper()->RequestReresolution();
489 return parent_->channel_control_helper()->GetAuthority();
492 void AddTraceEvent(TraceSeverity
severity,
498 RefCountedPtr<FixedAddressLoadBalancingPolicy>
parent_;
502 class FixedAddressFactory :
public LoadBalancingPolicyFactory {
504 FixedAddressFactory() =
default;
506 OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
508 return MakeOrphanable<FixedAddressLoadBalancingPolicy>(
std::move(
args));
511 const char*
name()
const override {
return kFixedAddressLbPolicyName; }
513 RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
515 std::vector<grpc_error_handle> error_list;
518 if (!error_list.empty()) {
520 "errors parsing fixed_address_lb config", &error_list);
523 return MakeRefCounted<FixedAddressConfig>(
std::move(address));
531 constexpr
char kOobBackendMetricTestLbPolicyName[] =
532 "oob_backend_metric_test_lb";
536 const char*
name()
const override {
537 return kOobBackendMetricTestLbPolicyName;
541 class OobBackendMetricTestLoadBalancingPolicy
542 :
public ForwardingLoadBalancingPolicy {
544 OobBackendMetricTestLoadBalancingPolicy(
Args args,
546 : ForwardingLoadBalancingPolicy(
548 RefCountedPtr<OobBackendMetricTestLoadBalancingPolicy>(this)),
554 ~OobBackendMetricTestLoadBalancingPolicy()
override =
default;
556 const char*
name()
const override {
557 return kOobBackendMetricTestLbPolicyName;
561 class BackendMetricWatcher :
public OobBackendMetricWatcher {
563 BackendMetricWatcher(
564 ServerAddress address,
565 RefCountedPtr<OobBackendMetricTestLoadBalancingPolicy> parent)
568 void OnBackendMetricReport(
569 const BackendMetricData& backend_metric_data)
override {
575 RefCountedPtr<OobBackendMetricTestLoadBalancingPolicy>
parent_;
578 class Helper :
public ChannelControlHelper {
581 RefCountedPtr<OobBackendMetricTestLoadBalancingPolicy> parent)
584 RefCountedPtr<SubchannelInterface> CreateSubchannel(
587 parent_->channel_control_helper()->CreateSubchannel(address,
args);
595 std::unique_ptr<SubchannelPicker> picker)
override {
600 void RequestReresolution()
override {
601 parent_->channel_control_helper()->RequestReresolution();
605 return parent_->channel_control_helper()->GetAuthority();
608 void AddTraceEvent(TraceSeverity
severity,
614 RefCountedPtr<OobBackendMetricTestLoadBalancingPolicy>
parent_;
621 class OobBackendMetricTestFactory :
public LoadBalancingPolicyFactory {
626 OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
628 return MakeOrphanable<OobBackendMetricTestLoadBalancingPolicy>(
632 const char*
name()
const override {
633 return kOobBackendMetricTestLbPolicyName;
636 RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
638 return MakeRefCounted<OobBackendMetricTestConfig>();
648 const char* delegate_policy_name) {
650 absl::make_unique<TestPickArgsLbFactory>(
std::move(
cb),
651 delegate_policy_name));
657 absl::make_unique<InterceptTrailingFactory>(
std::move(
cb)));
662 absl::make_unique<AddressTestFactory>(
std::move(
cb)));
667 absl::make_unique<FixedAddressFactory>());
673 absl::make_unique<OobBackendMetricTestFactory>(
std::move(
cb)));