Cluster: include node IDs in SLOTS output.

CLUSTER SLOTS now includes IDs in the nodes description associated with
a given slot range. Certain client libraries implementations need a way
to reference a node in an unique way, so they were relying on CLUSTER
NODES, that is not a stable API and may change frequently depending on
Redis Cluster future requirements.
This commit is contained in:
antirez 2016-01-29 12:00:38 +01:00
parent 8870a7e143
commit c285862621

View File

@ -3774,8 +3774,10 @@ void clusterReplyMultiBulkSlots(client *c) {
* 2) end slot * 2) end slot
* 3) 1) master IP * 3) 1) master IP
* 2) master port * 2) master port
* 3) node ID
* 4) 1) replica IP * 4) 1) replica IP
* 2) replica port * 2) replica port
* 3) node ID
* ... continued until done * ... continued until done
*/ */
@ -3816,18 +3818,20 @@ void clusterReplyMultiBulkSlots(client *c) {
start = -1; start = -1;
/* First node reply position is always the master */ /* First node reply position is always the master */
addReplyMultiBulkLen(c, 2); addReplyMultiBulkLen(c, 3);
addReplyBulkCString(c, node->ip); addReplyBulkCString(c, node->ip);
addReplyLongLong(c, node->port); addReplyLongLong(c, node->port);
addReplyBulkCBuffer(c, node->name, CLUSTER_NAMELEN);
/* Remaining nodes in reply are replicas for slot range */ /* Remaining nodes in reply are replicas for slot range */
for (i = 0; i < node->numslaves; i++) { for (i = 0; i < node->numslaves; i++) {
/* This loop is copy/pasted from clusterGenNodeDescription() /* This loop is copy/pasted from clusterGenNodeDescription()
* with modifications for per-slot node aggregation */ * with modifications for per-slot node aggregation */
if (nodeFailed(node->slaves[i])) continue; if (nodeFailed(node->slaves[i])) continue;
addReplyMultiBulkLen(c, 2); addReplyMultiBulkLen(c, 3);
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);
nested_elements++; nested_elements++;
} }
setDeferredMultiBulkLength(c, nested_replylen, nested_elements); setDeferredMultiBulkLength(c, nested_replylen, nested_elements);