From d218a4e2447feb18af59e702df8ea3815d55a375 Mon Sep 17 00:00:00 2001 From: antirez Date: Fri, 22 Feb 2013 19:18:30 +0100 Subject: [PATCH] Cluster: new state information, cluster size. The definition of cluster size is: the number of known nodes in the cluster that are masters and serving at least an hash slot. --- src/cluster.c | 19 +++++++++++++++++++ src/redis.h | 2 ++ 2 files changed, 21 insertions(+) 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);