diff --git a/src/cluster.c b/src/cluster.c index 24b14d1dc96e09025a847008e85798d715b7a539..cacf09bf34650b7a0c80a5f86100da2490ddd92a 100644 --- a/src/cluster.c +++ b/src/cluster.c @@ -691,6 +691,13 @@ void clusterAcceptHandler(aeEventLoop *el, int fd, void *privdata, int mask) { } } +/* Return the approximated number of sockets we are using in order to + * take the cluster bus connections. */ +unsigned long getClusterConnectionsCount(void) { + return server.cluster_enabled ? + (dictSize(server.cluster->nodes)*2) : 0; +} + /* ----------------------------------------------------------------------------- * Key space handling * -------------------------------------------------------------------------- */ diff --git a/src/cluster.h b/src/cluster.h index d3af4a355a9cc456c6c2580c1782bccd9ca70248..596a4629ad4ea3ecc0098be8f6c81e82da6dcc9b 100644 --- a/src/cluster.h +++ b/src/cluster.h @@ -283,5 +283,6 @@ typedef struct { clusterNode *getNodeByQuery(client *c, struct redisCommand *cmd, robj **argv, int argc, int *hashslot, int *ask); int clusterRedirectBlockedClientIfNeeded(client *c); void clusterRedirectClient(client *c, clusterNode *n, int hashslot, int error_code); +unsigned long getClusterConnectionsCount(void); #endif /* __CLUSTER_H */ diff --git a/src/networking.c b/src/networking.c index 77b9a6fcfe7757a2eff1a73e12786b58cee93e0a..9d36ed3a28e5c66e7adbe3aa279fb9fe27234dad 100644 --- a/src/networking.c +++ b/src/networking.c @@ -892,17 +892,24 @@ static void acceptCommonHandler(connection *conn, int flags, char *ip) { client *c; UNUSED(ip); - /* Admission control will happen before a client is created and connAccept() + /* Limit the number of connections we take at the same time. + * + * Admission control will happen before a client is created and connAccept() * called, because we don't want to even start transport-level negotiation - * if rejected. - */ - if (listLength(server.clients) >= server.maxclients) { - char *err = "-ERR max number of clients reached\r\n"; + * if rejected. */ + if (listLength(server.clients) + getClusterConnectionsCount() + >= server.maxclients) + { + char *err; + if (server.cluster_enabled) + err = "-ERR max number of clients reached\r\n"; + else + err = "-ERR max number of clients + cluster " + "connections reached\r\n"; /* That's a best effort error message, don't check write errors. - * Note that for TLS connections, no handshake was done yet so nothing is written - * and the connection will just drop. - */ + * Note that for TLS connections, no handshake was done yet so nothing + * is written and the connection will just drop. */ if (connWrite(conn,err,strlen(err)) == -1) { /* Nothing to do, Just to avoid the warning... */ }