Skip to content

Commit 7dfc3f5

Browse files
authored
Consistent hashing support server tag (#2994)
* fix: consistent hashing support server tag * add flag
1 parent d4e46bd commit 7dfc3f5

2 files changed

Lines changed: 20 additions & 3 deletions

File tree

src/brpc/policy/consistent_hashing_load_balancer.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ namespace policy {
3333
// TODO: or 160?
3434
DEFINE_int32(chash_num_replicas, 100,
3535
"default number of replicas per server in chash");
36+
DEFINE_bool(consistent_hashing_enable_server_tag, false,
37+
"if consistent hashing enable server with tag");
3638

3739
// Defined in hasher.cpp.
3840
const char* GetHashName(HashFunc hasher);
@@ -71,8 +73,14 @@ bool DefaultReplicaPolicy::Build(ServerId server,
7173
replicas->clear();
7274
for (size_t i = 0; i < num_replicas; ++i) {
7375
char host[256];
74-
int len = snprintf(host, sizeof(host), "%s-%lu",
76+
int len = 0;
77+
if (!FLAGS_consistent_hashing_enable_server_tag) {
78+
len = snprintf(host, sizeof(host), "%s-%lu",
7579
endpoint2str(ptr->remote_side()).c_str(), i);
80+
} else {
81+
len = snprintf(host, sizeof(host), "%s-%lu-%s",
82+
endpoint2str(ptr->remote_side()).c_str(), i, server.tag.c_str());
83+
}
7684
ConsistentHashingLoadBalancer::Node node;
7785
node.hash = _hash_func(host, len);
7886
node.server_sock = server;
@@ -104,8 +112,14 @@ bool KetamaReplicaPolicy::Build(ServerId server,
104112
<< "Ketam hash replicas number(" << num_replicas << ") should be n*4";
105113
for (size_t i = 0; i < num_replicas / points_per_hash; ++i) {
106114
char host[256];
107-
int len = snprintf(host, sizeof(host), "%s-%lu",
115+
int len = 0;
116+
if (!FLAGS_consistent_hashing_enable_server_tag) {
117+
len = snprintf(host, sizeof(host), "%s-%lu",
108118
endpoint2str(ptr->remote_side()).c_str(), i);
119+
} else {
120+
len = snprintf(host, sizeof(host), "%s-%lu-%s",
121+
endpoint2str(ptr->remote_side()).c_str(), i, server.tag.c_str());
122+
}
109123
unsigned char digest[MD5_DIGEST_LENGTH];
110124
MD5HashSignature(host, len, digest);
111125
for (size_t j = 0; j < points_per_hash; ++j) {

src/brpc/policy/consistent_hashing_load_balancer.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,10 @@ class ConsistentHashingLoadBalancer : public LoadBalancer {
5050
bool operator<(const Node &rhs) const {
5151
if (hash < rhs.hash) { return true; }
5252
if (hash > rhs.hash) { return false; }
53-
return server_addr < rhs.server_addr;
53+
if (server_addr < rhs.server_addr) { return true; }
54+
if (server_addr > rhs.server_addr) { return false; }
55+
// compare by tag if has the same ip-port
56+
return server_sock.tag < rhs.server_sock.tag;
5457
}
5558
bool operator<(const uint32_t code) const {
5659
return hash < code;

0 commit comments

Comments
 (0)