diff --git a/src/cluster.c b/src/cluster.c index 7a53b4715..8240134e7 100644 --- a/src/cluster.c +++ b/src/cluster.c @@ -217,6 +217,7 @@ void clusterInit(void) { server.cluster = zmalloc(sizeof(clusterState)); server.cluster->myself = NULL; server.cluster->state = REDIS_CLUSTER_FAIL; + server.cluster->size = 1; server.cluster->nodes = dictCreate(&clusterNodesDictType,NULL); server.cluster->node_timeout = 15; memset(server.cluster->migrating_slots_to,0, @@ -1254,6 +1255,24 @@ void clusterUpdateState(void) { } else { server.cluster->state = REDIS_CLUSTER_FAIL; } + + /* Compute the cluster size, that is the number of master nodes + * serving at least a single slot. */ + { + dictIterator *di; + dictEntry *de; + + server.cluster->size = 0; + di = dictGetIterator(server.cluster->nodes); + while((de = dictNext(di)) != NULL) { + clusterNode *node = dictGetVal(de); + + if (node->flags & REDIS_NODE_MASTER && + popcount(node->slots,sizeof(node->slots))) + server.cluster->size++; + } + dictReleaseIterator(di); + } } /* ----------------------------------------------------------------------------- diff --git a/src/redis.h b/src/redis.h index 96922ced2..4aba5b52b 100644 --- a/src/redis.h +++ b/src/redis.h @@ -570,6 +570,7 @@ typedef struct clusterNode clusterNode; typedef struct { clusterNode *myself; /* This node */ int state; /* REDIS_CLUSTER_OK, REDIS_CLUSTER_FAIL, ... */ + int size; /* Num of master nodes with at least one slot */ int node_timeout; dict *nodes; /* Hash table of name -> clusterNode structures */ clusterNode *migrating_slots_to[REDIS_CLUSTER_SLOTS]; @@ -960,6 +961,7 @@ long long mstime(void); void getRandomHexChars(char *p, unsigned int len); uint64_t crc64(uint64_t crc, const unsigned char *s, uint64_t l); void exitFromChild(int retcode); +long popcount(void *s, long count); /* networking.c -- Networking and Client related operations */ redisClient *createClient(int fd);