1
#include "source/extensions/load_balancing_policies/wrr_locality/wrr_locality_lb.h"
2

            
3
namespace Envoy {
4
namespace Extensions {
5
namespace LoadBalancingPolicies {
6
namespace WrrLocality {
7

            
8
WrrLocalityLoadBalancer::WrrLocalityLoadBalancer(
9
    OptRef<const Upstream::LoadBalancerConfig> lb_config, const Upstream::ClusterInfo& cluster_info,
10
    const Upstream::PrioritySet& priority_set, Runtime::Loader& runtime,
11
3
    Envoy::Random::RandomGenerator& random, TimeSource& time_source) {
12
3
  const auto* typed_lb_config = dynamic_cast<const WrrLocalityLbConfig*>(lb_config.ptr());
13
3
  ASSERT(typed_lb_config != nullptr);
14
3
  endpoint_picking_policy_ = typed_lb_config->endpoint_picking_policy_factory_.create(
15
3
      *typed_lb_config->endpoint_picking_policy_config_, cluster_info, priority_set, runtime,
16
3
      random, time_source);
17
3
  factory_ =
18
3
      std::make_shared<WorkerLocalLbFactory>(cluster_info, endpoint_picking_policy_->factory());
19
3
}
20

            
21
Upstream::LoadBalancerPtr
22
5
WrrLocalityLoadBalancer::WorkerLocalLbFactory::create(Upstream::LoadBalancerParams params) {
23
  // Ensure that the endpoint picking policy is a ClientSideWeightedRoundRobinLoadBalancer.
24
5
  auto* client_side_weighted_round_robin_factory = dynamic_cast<
25
5
      ::Envoy::Upstream::ClientSideWeightedRoundRobinLoadBalancer::WorkerLocalLbFactory*>(
26
5
      endpoint_picking_policy_factory_.get());
27
5
  if (client_side_weighted_round_robin_factory == nullptr) {
28
    return nullptr;
29
  }
30
  // Tell the worker local LB to use locality weights.
31
5
  auto lb_config = cluster_info_.lbConfig();
32
5
  lb_config.mutable_locality_weighted_lb_config();
33
5
  return client_side_weighted_round_robin_factory->createWithCommonLbConfig(lb_config, params);
34
5
}
35

            
36
} // namespace WrrLocality
37
} // namespace LoadBalancingPolicies
38
} // namespace Extensions
39
} // namespace Envoy