optimize the output of cluster slots

This commit is contained in:
yanhui13 2020-04-21 16:55:05 +08:00
parent c49fb47fbe
commit 92974f9a98

View File

@ -4191,11 +4191,17 @@ void clusterReplyMultiBulkSlots(client *c) {
while((de = dictNext(di)) != NULL) { while((de = dictNext(di)) != NULL) {
clusterNode *node = dictGetVal(de); clusterNode *node = dictGetVal(de);
int j = 0, start = -1; int j = 0, start = -1;
int i, nested_elements = 0;
/* Skip slaves (that are iterated when producing the output of their /* Skip slaves (that are iterated when producing the output of their
* master) and masters not serving any slot. */ * master) and masters not serving any slot. */
if (!nodeIsMaster(node) || node->numslots == 0) continue; if (!nodeIsMaster(node) || node->numslots == 0) continue;
for(i = 0; i < node->numslaves; i++) {
if (nodeFailed(node->slaves[i])) continue;
nested_elements++;
}
for (j = 0; j < CLUSTER_SLOTS; j++) { for (j = 0; j < CLUSTER_SLOTS; j++) {
int bit, i; int bit, i;
@ -4203,8 +4209,7 @@ void clusterReplyMultiBulkSlots(client *c) {
if (start == -1) start = j; if (start == -1) start = j;
} }
if (start != -1 && (!bit || j == CLUSTER_SLOTS-1)) { if (start != -1 && (!bit || j == CLUSTER_SLOTS-1)) {
int nested_elements = 3; /* slots (2) + master addr (1). */ addReplyArrayLen(c, nested_elements + 3); /* slots (2) + master addr (1). */
void *nested_replylen = addReplyDeferredLen(c);
if (bit && j == CLUSTER_SLOTS-1) j++; if (bit && j == CLUSTER_SLOTS-1) j++;
@ -4234,9 +4239,7 @@ void clusterReplyMultiBulkSlots(client *c) {
addReplyBulkCString(c, node->slaves[i]->ip); addReplyBulkCString(c, node->slaves[i]->ip);
addReplyLongLong(c, node->slaves[i]->port); addReplyLongLong(c, node->slaves[i]->port);
addReplyBulkCBuffer(c, node->slaves[i]->name, CLUSTER_NAMELEN); addReplyBulkCBuffer(c, node->slaves[i]->name, CLUSTER_NAMELEN);
nested_elements++;
} }
setDeferredArrayLen(c, nested_replylen, nested_elements);
num_masters++; num_masters++;
} }
} }