Commit c9a9ffa3 authored by caidaojin's avatar caidaojin

move SetParameters function to New()

parent f97f4b89
...@@ -74,16 +74,11 @@ int SharedLoadBalancer::Init(const char* lb_protocol) { ...@@ -74,16 +74,11 @@ int SharedLoadBalancer::Init(const char* lb_protocol) {
LOG(FATAL) << "Fail to find LoadBalancer by `" << lb_name << "'"; LOG(FATAL) << "Fail to find LoadBalancer by `" << lb_name << "'";
return -1; return -1;
} }
LoadBalancer* lb_copy = lb->New(); LoadBalancer* _lb = lb->New(lb_params);
if (lb_copy == NULL) { if (_lb == NULL) {
LOG(FATAL) << "Fail to new LoadBalancer"; LOG(FATAL) << "Fail to new LoadBalancer";
return -1; return -1;
} }
_lb = lb_copy;
if (!_lb->SetParameters(lb_params)) {
LOG(FATAL) << "Fail to set parameters of lb `" << lb_protocol << "'";
return -1;
}
if (FLAGS_show_lb_in_vars && !_exposed) { if (FLAGS_show_lb_in_vars && !_exposed) {
ExposeLB(); ExposeLB();
} }
......
...@@ -102,11 +102,7 @@ public: ...@@ -102,11 +102,7 @@ public:
// Create/destroy an instance. // Create/destroy an instance.
// Caller is responsible for Destroy() the instance after usage. // Caller is responsible for Destroy() the instance after usage.
virtual LoadBalancer* New() const = 0; virtual LoadBalancer* New(const butil::StringPiece& params) const = 0;
// Config user passed parameters to lb after construction which
// make lb function more flexible.
virtual bool SetParameters(const butil::StringPiece& params) { return true; }
protected: protected:
virtual ~LoadBalancer() { } virtual ~LoadBalancer() { }
......
...@@ -31,6 +31,9 @@ namespace policy { ...@@ -31,6 +31,9 @@ namespace policy {
DEFINE_int32(chash_num_replicas, 100, DEFINE_int32(chash_num_replicas, 100,
"default number of replicas per server in chash"); "default number of replicas per server in chash");
// Defined in hasher.cpp.
const char* GetHashName(HashFunc hasher);
class ReplicaPolicy { class ReplicaPolicy {
public: public:
virtual ~ReplicaPolicy() = default; virtual ~ReplicaPolicy() = default;
...@@ -38,6 +41,7 @@ public: ...@@ -38,6 +41,7 @@ public:
virtual bool Build(ServerId server, virtual bool Build(ServerId server,
size_t num_replicas, size_t num_replicas,
std::vector<ConsistentHashingLoadBalancer::Node>* replicas) const = 0; std::vector<ConsistentHashingLoadBalancer::Node>* replicas) const = 0;
virtual const char* name() const = 0;
}; };
class DefaultReplicaPolicy : public ReplicaPolicy { class DefaultReplicaPolicy : public ReplicaPolicy {
...@@ -47,6 +51,9 @@ public: ...@@ -47,6 +51,9 @@ public:
virtual bool Build(ServerId server, virtual bool Build(ServerId server,
size_t num_replicas, size_t num_replicas,
std::vector<ConsistentHashingLoadBalancer::Node>* replicas) const; std::vector<ConsistentHashingLoadBalancer::Node>* replicas) const;
virtual const char* name() const { return GetHashName(_hash_func); }
private: private:
HashFunc _hash_func; HashFunc _hash_func;
}; };
...@@ -77,6 +84,8 @@ public: ...@@ -77,6 +84,8 @@ public:
virtual bool Build(ServerId server, virtual bool Build(ServerId server,
size_t num_replicas, size_t num_replicas,
std::vector<ConsistentHashingLoadBalancer::Node>* replicas) const; std::vector<ConsistentHashingLoadBalancer::Node>* replicas) const;
virtual const char* name() const { return "ketama"; }
}; };
bool KetamaReplicaPolicy::Build(ServerId server, bool KetamaReplicaPolicy::Build(ServerId server,
...@@ -112,19 +121,14 @@ bool KetamaReplicaPolicy::Build(ServerId server, ...@@ -112,19 +121,14 @@ bool KetamaReplicaPolicy::Build(ServerId server,
namespace { namespace {
const std::array<std::pair<const ReplicaPolicy*, std::string>, CONS_HASH_LB_LAST> const std::array<const ReplicaPolicy*, CONS_HASH_LB_LAST> g_replica_policy = {
g_replica_policy = { new DefaultReplicaPolicy(MurmurHash32),
std::make_pair(new DefaultReplicaPolicy(MurmurHash32), "murmurhash3"), new DefaultReplicaPolicy(MD5Hash32),
std::make_pair(new DefaultReplicaPolicy(MD5Hash32), "md5"), new KetamaReplicaPolicy
std::make_pair(new KetamaReplicaPolicy, "ketama")
}; };
inline const ReplicaPolicy* GetReplicaPolicy(ConsistentHashingLoadBalancerType type) { inline const ReplicaPolicy* GetReplicaPolicy(ConsistentHashingLoadBalancerType type) {
return g_replica_policy.at(type).first; return g_replica_policy.at(type);
}
inline const std::string& GetLbName(ConsistentHashingLoadBalancerType type) {
return g_replica_policy.at(type).second;
} }
} // namespace } // namespace
...@@ -261,8 +265,14 @@ size_t ConsistentHashingLoadBalancer::RemoveServersInBatch( ...@@ -261,8 +265,14 @@ size_t ConsistentHashingLoadBalancer::RemoveServersInBatch(
return n; return n;
} }
LoadBalancer *ConsistentHashingLoadBalancer::New() const { LoadBalancer *ConsistentHashingLoadBalancer::New(const butil::StringPiece& params) const {
return new (std::nothrow) ConsistentHashingLoadBalancer(_type); ConsistentHashingLoadBalancer* lb =
new (std::nothrow) ConsistentHashingLoadBalancer(_type);
if (lb != nullptr && !lb->SetParameters(params)) {
delete lb;
lb = nullptr;
}
return lb;
} }
void ConsistentHashingLoadBalancer::Destroy() { void ConsistentHashingLoadBalancer::Destroy() {
...@@ -313,7 +323,7 @@ void ConsistentHashingLoadBalancer::Describe( ...@@ -313,7 +323,7 @@ void ConsistentHashingLoadBalancer::Describe(
return; return;
} }
os << "ConsistentHashingLoadBalancer {\n" os << "ConsistentHashingLoadBalancer {\n"
<< " hash function: " << GetLbName(_type) << '\n' << " hash function: " << _replicas_policy->name() << '\n'
<< " replica per host: " << _num_replicas << '\n'; << " replica per host: " << _num_replicas << '\n';
std::map<butil::EndPoint, double> load_map; std::map<butil::EndPoint, double> load_map;
GetLoads(&load_map); GetLoads(&load_map);
......
...@@ -59,11 +59,11 @@ public: ...@@ -59,11 +59,11 @@ public:
bool RemoveServer(const ServerId& server); bool RemoveServer(const ServerId& server);
size_t AddServersInBatch(const std::vector<ServerId> &servers); size_t AddServersInBatch(const std::vector<ServerId> &servers);
size_t RemoveServersInBatch(const std::vector<ServerId> &servers); size_t RemoveServersInBatch(const std::vector<ServerId> &servers);
LoadBalancer *New() const; LoadBalancer *New(const butil::StringPiece& params) const;
void Destroy(); void Destroy();
int SelectServer(const SelectIn &in, SelectOut *out); int SelectServer(const SelectIn &in, SelectOut *out);
void Describe(std::ostream &os, const DescribeOptions& options); void Describe(std::ostream &os, const DescribeOptions& options);
virtual bool SetParameters(const butil::StringPiece& params); bool SetParameters(const butil::StringPiece& params);
private: private:
void GetLoads(std::map<butil::EndPoint, double> *load_map); void GetLoads(std::map<butil::EndPoint, double> *load_map);
......
...@@ -159,7 +159,7 @@ int DynPartLoadBalancer::SelectServer(const SelectIn& in, SelectOut* out) { ...@@ -159,7 +159,7 @@ int DynPartLoadBalancer::SelectServer(const SelectIn& in, SelectOut* out) {
return EHOSTDOWN; return EHOSTDOWN;
} }
DynPartLoadBalancer* DynPartLoadBalancer::New() const { DynPartLoadBalancer* DynPartLoadBalancer::New(const butil::StringPiece&) const {
return new (std::nothrow) DynPartLoadBalancer; return new (std::nothrow) DynPartLoadBalancer;
} }
......
...@@ -36,7 +36,7 @@ public: ...@@ -36,7 +36,7 @@ public:
size_t AddServersInBatch(const std::vector<ServerId>& servers); size_t AddServersInBatch(const std::vector<ServerId>& servers);
size_t RemoveServersInBatch(const std::vector<ServerId>& servers); size_t RemoveServersInBatch(const std::vector<ServerId>& servers);
int SelectServer(const SelectIn& in, SelectOut* out); int SelectServer(const SelectIn& in, SelectOut* out);
DynPartLoadBalancer* New() const; DynPartLoadBalancer* New(const butil::StringPiece&) const;
void Destroy(); void Destroy();
void Describe(std::ostream&, const DescribeOptions& options); void Describe(std::ostream&, const DescribeOptions& options);
......
...@@ -460,7 +460,8 @@ int64_t LocalityAwareLoadBalancer::Weight::Update( ...@@ -460,7 +460,8 @@ int64_t LocalityAwareLoadBalancer::Weight::Update(
return ResetWeight(index, end_time_us); return ResetWeight(index, end_time_us);
} }
LocalityAwareLoadBalancer* LocalityAwareLoadBalancer::New() const { LocalityAwareLoadBalancer* LocalityAwareLoadBalancer::New(
const butil::StringPiece&) const {
return new (std::nothrow) LocalityAwareLoadBalancer; return new (std::nothrow) LocalityAwareLoadBalancer;
} }
......
...@@ -44,7 +44,7 @@ public: ...@@ -44,7 +44,7 @@ public:
bool RemoveServer(const ServerId& id); bool RemoveServer(const ServerId& id);
size_t AddServersInBatch(const std::vector<ServerId>& servers); size_t AddServersInBatch(const std::vector<ServerId>& servers);
size_t RemoveServersInBatch(const std::vector<ServerId>& servers); size_t RemoveServersInBatch(const std::vector<ServerId>& servers);
LocalityAwareLoadBalancer* New() const; LocalityAwareLoadBalancer* New(const butil::StringPiece&) const;
void Destroy(); void Destroy();
int SelectServer(const SelectIn& in, SelectOut* out); int SelectServer(const SelectIn& in, SelectOut* out);
void Feedback(const CallInfo& info); void Feedback(const CallInfo& info);
......
...@@ -134,7 +134,8 @@ int RandomizedLoadBalancer::SelectServer(const SelectIn& in, SelectOut* out) { ...@@ -134,7 +134,8 @@ int RandomizedLoadBalancer::SelectServer(const SelectIn& in, SelectOut* out) {
return EHOSTDOWN; return EHOSTDOWN;
} }
RandomizedLoadBalancer* RandomizedLoadBalancer::New() const { RandomizedLoadBalancer* RandomizedLoadBalancer::New(
const butil::StringPiece&) const {
return new (std::nothrow) RandomizedLoadBalancer; return new (std::nothrow) RandomizedLoadBalancer;
} }
......
...@@ -36,7 +36,7 @@ public: ...@@ -36,7 +36,7 @@ public:
size_t AddServersInBatch(const std::vector<ServerId>& servers); size_t AddServersInBatch(const std::vector<ServerId>& servers);
size_t RemoveServersInBatch(const std::vector<ServerId>& servers); size_t RemoveServersInBatch(const std::vector<ServerId>& servers);
int SelectServer(const SelectIn& in, SelectOut* out); int SelectServer(const SelectIn& in, SelectOut* out);
RandomizedLoadBalancer* New() const; RandomizedLoadBalancer* New(const butil::StringPiece&) const;
void Destroy(); void Destroy();
void Describe(std::ostream& os, const DescribeOptions&); void Describe(std::ostream& os, const DescribeOptions&);
......
...@@ -131,7 +131,8 @@ int RoundRobinLoadBalancer::SelectServer(const SelectIn& in, SelectOut* out) { ...@@ -131,7 +131,8 @@ int RoundRobinLoadBalancer::SelectServer(const SelectIn& in, SelectOut* out) {
return EHOSTDOWN; return EHOSTDOWN;
} }
RoundRobinLoadBalancer* RoundRobinLoadBalancer::New() const { RoundRobinLoadBalancer* RoundRobinLoadBalancer::New(
const butil::StringPiece&) const {
return new (std::nothrow) RoundRobinLoadBalancer; return new (std::nothrow) RoundRobinLoadBalancer;
} }
......
...@@ -35,7 +35,7 @@ public: ...@@ -35,7 +35,7 @@ public:
size_t AddServersInBatch(const std::vector<ServerId>& servers); size_t AddServersInBatch(const std::vector<ServerId>& servers);
size_t RemoveServersInBatch(const std::vector<ServerId>& servers); size_t RemoveServersInBatch(const std::vector<ServerId>& servers);
int SelectServer(const SelectIn& in, SelectOut* out); int SelectServer(const SelectIn& in, SelectOut* out);
RoundRobinLoadBalancer* New() const; RoundRobinLoadBalancer* New(const butil::StringPiece&) const;
void Destroy(); void Destroy();
void Describe(std::ostream&, const DescribeOptions& options); void Describe(std::ostream&, const DescribeOptions& options);
......
...@@ -213,7 +213,8 @@ SocketId WeightedRoundRobinLoadBalancer::GetServerInNextStride( ...@@ -213,7 +213,8 @@ SocketId WeightedRoundRobinLoadBalancer::GetServerInNextStride(
return final_server; return final_server;
} }
LoadBalancer* WeightedRoundRobinLoadBalancer::New() const { LoadBalancer* WeightedRoundRobinLoadBalancer::New(
const butil::StringPiece&) const {
return new (std::nothrow) WeightedRoundRobinLoadBalancer; return new (std::nothrow) WeightedRoundRobinLoadBalancer;
} }
......
...@@ -34,7 +34,7 @@ public: ...@@ -34,7 +34,7 @@ public:
size_t AddServersInBatch(const std::vector<ServerId>& servers); size_t AddServersInBatch(const std::vector<ServerId>& servers);
size_t RemoveServersInBatch(const std::vector<ServerId>& servers); size_t RemoveServersInBatch(const std::vector<ServerId>& servers);
int SelectServer(const SelectIn& in, SelectOut* out); int SelectServer(const SelectIn& in, SelectOut* out);
LoadBalancer* New() const; LoadBalancer* New(const butil::StringPiece&) const;
void Destroy(); void Destroy();
void Describe(std::ostream&, const DescribeOptions& options); void Describe(std::ostream&, const DescribeOptions& options);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment