Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Passing priority sets to loadbalancers (still unused for picking) #2154

Merged
merged 2 commits into from
Dec 5, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 14 additions & 17 deletions source/common/upstream/cluster_manager_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -617,43 +617,40 @@ ClusterManagerImpl::ThreadLocalClusterManagerImpl::ClusterEntry::ClusterEntry(
parent.parent_.local_info_, parent.parent_, parent.parent_.runtime_,
parent.parent_.random_,
Router::ShadowWriterPtr{new Router::ShadowWriterImpl(parent.parent_)}) {

// TODO(alyssawilk) make lb priority-set aware in a follow-up patch.
HostSet& host_set = priority_set_.getOrCreateHostSet(0);
HostSet* local_host_set = nullptr;
if (parent.local_priority_set_) {
local_host_set = parent.local_priority_set_->hostSetsPerPriority()[0].get();
}
priority_set_.getOrCreateHostSet(0);

if (cluster->lbSubsetInfo().isEnabled()) {
lb_.reset(new SubsetLoadBalancer(cluster->lbType(), host_set, local_host_set, cluster->stats(),
parent.parent_.runtime_, parent.parent_.random_,
cluster->lbSubsetInfo(), cluster->lbRingHashConfig()));
lb_.reset(new SubsetLoadBalancer(cluster->lbType(), priority_set_, parent_.local_priority_set_,
cluster->stats(), parent.parent_.runtime_,
parent.parent_.random_, cluster->lbSubsetInfo(),
cluster->lbRingHashConfig()));
} else {
switch (cluster->lbType()) {
case LoadBalancerType::LeastRequest: {
lb_.reset(new LeastRequestLoadBalancer(host_set, local_host_set, cluster->stats(),
parent.parent_.runtime_, parent.parent_.random_));
lb_.reset(new LeastRequestLoadBalancer(priority_set_, parent_.local_priority_set_,
cluster->stats(), parent.parent_.runtime_,
parent.parent_.random_));
break;
}
case LoadBalancerType::Random: {
lb_.reset(new RandomLoadBalancer(host_set, local_host_set, cluster->stats(),
lb_.reset(new RandomLoadBalancer(priority_set_, parent_.local_priority_set_, cluster->stats(),
parent.parent_.runtime_, parent.parent_.random_));
break;
}
case LoadBalancerType::RoundRobin: {
lb_.reset(new RoundRobinLoadBalancer(host_set, local_host_set, cluster->stats(),
parent.parent_.runtime_, parent.parent_.random_));
lb_.reset(new RoundRobinLoadBalancer(priority_set_, parent_.local_priority_set_,
cluster->stats(), parent.parent_.runtime_,
parent.parent_.random_));
break;
}
case LoadBalancerType::RingHash: {
lb_.reset(new RingHashLoadBalancer(host_set, cluster->stats(), parent.parent_.runtime_,
lb_.reset(new RingHashLoadBalancer(priority_set_, cluster->stats(), parent.parent_.runtime_,
parent.parent_.random_, cluster->lbRingHashConfig()));
break;
}
case LoadBalancerType::OriginalDst: {
lb_.reset(new OriginalDstCluster::LoadBalancer(
host_set, parent.parent_.primary_clusters_.at(cluster->name()).cluster_));
priority_set_, parent.parent_.primary_clusters_.at(cluster->name()).cluster_));
break;
}
}
Expand Down
22 changes: 12 additions & 10 deletions source/common/upstream/load_balancer_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,13 @@ static const std::string RuntimeZoneEnabled = "upstream.zone_routing.enabled";
static const std::string RuntimeMinClusterSize = "upstream.zone_routing.min_cluster_size";
static const std::string RuntimePanicThreshold = "upstream.healthy_panic_threshold";

LoadBalancerBase::LoadBalancerBase(const HostSet& host_set, const HostSet* local_host_set,
ClusterStats& stats, Runtime::Loader& runtime,
Runtime::RandomGenerator& random)
: stats_(stats), runtime_(runtime), random_(random), host_set_(host_set),
local_host_set_(local_host_set) {
LoadBalancerBase::LoadBalancerBase(const PrioritySet& priority_set,
const PrioritySet* local_priority_set, ClusterStats& stats,
Runtime::Loader& runtime, Runtime::RandomGenerator& random)
: stats_(stats), runtime_(runtime), random_(random),
host_set_(*priority_set.hostSetsPerPriority()[0]),
local_host_set_(local_priority_set ? local_priority_set->hostSetsPerPriority()[0].get()
: nullptr) {
if (local_host_set_) {
host_set_.addMemberUpdateCb([this](uint32_t, const std::vector<HostSharedPtr>&,
const std::vector<HostSharedPtr>&) -> void {
Expand Down Expand Up @@ -243,13 +245,13 @@ HostConstSharedPtr RoundRobinLoadBalancer::chooseHost(LoadBalancerContext*) {
return hosts_to_use[rr_index_++ % hosts_to_use.size()];
}

LeastRequestLoadBalancer::LeastRequestLoadBalancer(const HostSet& host_set,
const HostSet* local_host_set,
LeastRequestLoadBalancer::LeastRequestLoadBalancer(const PrioritySet& priority_set,
const PrioritySet* local_priority_set,
ClusterStats& stats, Runtime::Loader& runtime,
Runtime::RandomGenerator& random)
: LoadBalancerBase(host_set, local_host_set, stats, runtime, random) {
host_set.addMemberUpdateCb([this](uint32_t, const std::vector<HostSharedPtr>&,
const std::vector<HostSharedPtr>& hosts_removed) -> void {
: LoadBalancerBase(priority_set, local_priority_set, stats, runtime, random) {
host_set_.addMemberUpdateCb([this](uint32_t, const std::vector<HostSharedPtr>&,
const std::vector<HostSharedPtr>& hosts_removed) -> void {
if (last_host_) {
for (const HostSharedPtr& host : hosts_removed) {
if (host == last_host_) {
Expand Down
22 changes: 13 additions & 9 deletions source/common/upstream/load_balancer_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ class LoadBalancerUtility {
*/
class LoadBalancerBase {
protected:
LoadBalancerBase(const HostSet& host_set, const HostSet* local_host_set, ClusterStats& stats,
Runtime::Loader& runtime, Runtime::RandomGenerator& random);
LoadBalancerBase(const PrioritySet& priority_set, const PrioritySet* local_priority_set,
ClusterStats& stats, Runtime::Loader& runtime, Runtime::RandomGenerator& random);
~LoadBalancerBase();

/**
Expand All @@ -44,6 +44,10 @@ class LoadBalancerBase {
Runtime::Loader& runtime_;
Runtime::RandomGenerator& random_;

// TODO(alyssawilk) make load balancers priority-aware and remove.
protected:
const HostSet& host_set_;

private:
enum class LocalityRoutingState { NoLocalityRouting, LocalityDirect, LocalityResidual };

Expand Down Expand Up @@ -72,7 +76,6 @@ class LoadBalancerBase {
*/
void regenerateLocalityRoutingStructures();

const HostSet& host_set_;
const HostSet* local_host_set_;
uint64_t local_percent_to_route_{};
LocalityRoutingState locality_routing_state_{LocalityRoutingState::NoLocalityRouting};
Expand All @@ -85,10 +88,10 @@ class LoadBalancerBase {
*/
class RoundRobinLoadBalancer : public LoadBalancer, LoadBalancerBase {
public:
RoundRobinLoadBalancer(const HostSet& host_set, const HostSet* local_host_set_,
RoundRobinLoadBalancer(const PrioritySet& priority_set, const PrioritySet* local_priority_set,
ClusterStats& stats, Runtime::Loader& runtime,
Runtime::RandomGenerator& random)
: LoadBalancerBase(host_set, local_host_set_, stats, runtime, random) {}
: LoadBalancerBase(priority_set, local_priority_set, stats, runtime, random) {}

// Upstream::LoadBalancer
HostConstSharedPtr chooseHost(LoadBalancerContext* context) override;
Expand All @@ -112,7 +115,7 @@ class RoundRobinLoadBalancer : public LoadBalancer, LoadBalancerBase {
*/
class LeastRequestLoadBalancer : public LoadBalancer, LoadBalancerBase {
public:
LeastRequestLoadBalancer(const HostSet& host_set, const HostSet* local_host_set_,
LeastRequestLoadBalancer(const PrioritySet& priority_set, const PrioritySet* local_priority_set,
ClusterStats& stats, Runtime::Loader& runtime,
Runtime::RandomGenerator& random);

Expand All @@ -129,9 +132,10 @@ class LeastRequestLoadBalancer : public LoadBalancer, LoadBalancerBase {
*/
class RandomLoadBalancer : public LoadBalancer, LoadBalancerBase {
public:
RandomLoadBalancer(const HostSet& host_set, const HostSet* local_host_set, ClusterStats& stats,
Runtime::Loader& runtime, Runtime::RandomGenerator& random)
: LoadBalancerBase(host_set, local_host_set, stats, runtime, random) {}
RandomLoadBalancer(const PrioritySet& priority_set, const PrioritySet* local_priority_set,
ClusterStats& stats, Runtime::Loader& runtime,
Runtime::RandomGenerator& random)
: LoadBalancerBase(priority_set, local_priority_set, stats, runtime, random) {}

// Upstream::LoadBalancer
HostConstSharedPtr chooseHost(LoadBalancerContext* context) override;
Expand Down
10 changes: 5 additions & 5 deletions source/common/upstream/original_dst_cluster.cc
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@ namespace Upstream {
// OriginalDstCluster::LoadBalancer is never configured with any other type of cluster,
// and throws an exception otherwise.

OriginalDstCluster::LoadBalancer::LoadBalancer(HostSet& host_set, ClusterSharedPtr& parent)
: host_set_(host_set), parent_(std::static_pointer_cast<OriginalDstCluster>(parent)),
OriginalDstCluster::LoadBalancer::LoadBalancer(PrioritySet& priority_set, ClusterSharedPtr& parent)
: priority_set_(priority_set), parent_(std::static_pointer_cast<OriginalDstCluster>(parent)),
info_(parent->info()) {
// host_set_ is initially empty.
host_set_.addMemberUpdateCb([this](uint32_t, const std::vector<HostSharedPtr>& hosts_added,
const std::vector<HostSharedPtr>& hosts_removed) -> void {
// priority_set_ is initially empty.
priority_set_.addMemberUpdateCb([this](uint32_t, const std::vector<HostSharedPtr>& hosts_added,
const std::vector<HostSharedPtr>& hosts_removed) -> void {
// Update the hosts map
for (const HostSharedPtr& host : hosts_removed) {
ENVOY_LOG(debug, "Removing host {}.", host->address()->asString());
Expand Down
4 changes: 2 additions & 2 deletions source/common/upstream/original_dst_cluster.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class OriginalDstCluster : public ClusterImplBase {
*/
class LoadBalancer : public Upstream::LoadBalancer {
public:
LoadBalancer(HostSet& host_set, ClusterSharedPtr& parent);
LoadBalancer(PrioritySet& priority_set, ClusterSharedPtr& parent);

// Upstream::LoadBalancer
HostConstSharedPtr chooseHost(LoadBalancerContext* context) override;
Expand Down Expand Up @@ -91,7 +91,7 @@ class OriginalDstCluster : public ClusterImplBase {
std::unordered_multimap<std::string, HostSharedPtr> map_;
};

HostSet& host_set_; // Thread local host set.
PrioritySet& priority_set_; // Thread local priority set.
std::weak_ptr<OriginalDstCluster> parent_; // Primary cluster managed by the main thread.
ClusterInfoConstSharedPtr info_;
HostMap host_map_;
Expand Down
5 changes: 3 additions & 2 deletions source/common/upstream/ring_hash_lb.cc
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,11 @@ namespace Envoy {
namespace Upstream {

RingHashLoadBalancer::RingHashLoadBalancer(
HostSet& host_set, ClusterStats& stats, Runtime::Loader& runtime,
PrioritySet& priority_set, ClusterStats& stats, Runtime::Loader& runtime,
Runtime::RandomGenerator& random,
const Optional<envoy::api::v2::Cluster::RingHashLbConfig>& config)
: host_set_(host_set), stats_(stats), runtime_(runtime), random_(random), config_(config) {
: host_set_(*priority_set.hostSetsPerPriority()[0]), stats_(stats), runtime_(runtime),
random_(random), config_(config) {
host_set_.addMemberUpdateCb([this](uint32_t, const std::vector<HostSharedPtr>&,
const std::vector<HostSharedPtr>&) -> void { refresh(); });

Expand Down
2 changes: 1 addition & 1 deletion source/common/upstream/ring_hash_lb.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ namespace Upstream {
*/
class RingHashLoadBalancer : public LoadBalancer, Logger::Loggable<Logger::Id::upstream> {
public:
RingHashLoadBalancer(HostSet& host_set, ClusterStats& stats, Runtime::Loader& runtime,
RingHashLoadBalancer(PrioritySet& priority_set, ClusterStats& stats, Runtime::Loader& runtime,
Runtime::RandomGenerator& random,
const Optional<envoy::api::v2::Cluster::RingHashLbConfig>& config);

Expand Down
Loading