diff options
author | Marius Adam <adamhoreamarius@gmail.com> | 2022-07-17 14:48:08 +0300 |
---|---|---|
committer | Michael Grunder <michael.grunder@gmail.com> | 2022-09-19 22:09:35 +0300 |
commit | f2bfd723573d2099ec411812c5a096da7eea94ff (patch) | |
tree | 141f8ee4203bac700c5c8d6040d1510966d9f19b | |
parent | 130b5d0b8e18ccb8cd37630f9d54f958a556f8dc (diff) |
Issue #2080: avoid registering the same replicas multiple times in case the master handles multiple slot ranges
-rw-r--r-- | cluster_library.c | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/cluster_library.c b/cluster_library.c index b14b1ac4..f11c2dcb 100644 --- a/cluster_library.c +++ b/cluster_library.c @@ -709,25 +709,25 @@ static int cluster_map_slots(redisCluster *c, clusterReply *r) { if ((pnode = zend_hash_str_find_ptr(c->nodes, key, klen)) == NULL) { master = cluster_node_create(c, host, hlen, port, low, 0); zend_hash_str_update_ptr(c->nodes, key, klen, master); - } else { - master = pnode; - } - // Attach slaves - for (j = 3; j< r2->elements; j++) { - r3 = r2->element[j]; - if (!VALIDATE_SLOTS_INNER(r3)) { - return -1; - } + // Attach slaves first time we encounter a given master in order to avoid regitering the slaves multiple times + for (j = 3; j< r2->elements; j++) { + r3 = r2->element[j]; + if (!VALIDATE_SLOTS_INNER(r3)) { + return -1; + } - // Skip slaves where the host is "" - if (r3->element[0]->len == 0) continue; + // Skip slaves where the host is "" + if (r3->element[0]->len == 0) continue; - // Attach this node to our slave - slave = cluster_node_create(c, r3->element[0]->str, - (int)r3->element[0]->len, - (unsigned short)r3->element[1]->integer, low, 1); - cluster_node_add_slave(master, slave); + // Attach this node to our slave + slave = cluster_node_create(c, r3->element[0]->str, + (int)r3->element[0]->len, + (unsigned short)r3->element[1]->integer, low, 1); + cluster_node_add_slave(master, slave); + } + } else { + master = pnode; } // Attach this node to each slot in the range |