diff --git a/src/networking.c b/src/networking.c index 81b66f914b01a7f26068a484d17936b109e99293..6de7fc12c151b4cee20875f02715e4f54981d007 100644 --- a/src/networking.c +++ b/src/networking.c @@ -534,6 +534,7 @@ void copyClientOutputBuffer(redisClient *dst, redisClient *src) { dst->reply_bytes = src->reply_bytes; } +#define MAX_ACCEPTS_PER_CALL 1000 static void acceptCommonHandler(int fd, int flags) { redisClient *c; if ((c = createClient(fd)) == NULL) { @@ -563,37 +564,44 @@ static void acceptCommonHandler(int fd, int flags) { } void acceptTcpHandler(aeEventLoop *el, int fd, void *privdata, int mask) { - int cport, cfd; + int cport, cfd, max = MAX_ACCEPTS_PER_CALL; char cip[REDIS_IP_STR_LEN]; REDIS_NOTUSED(el); REDIS_NOTUSED(mask); REDIS_NOTUSED(privdata); - cfd = anetTcpAccept(server.neterr, fd, cip, sizeof(cip), &cport); - if (cfd == ANET_ERR) { - redisLog(REDIS_WARNING,"Accepting client connection: %s", server.neterr); - return; + while(max--) { + cfd = anetTcpAccept(server.neterr, fd, cip, sizeof(cip), &cport); + if (cfd == ANET_ERR) { + if (errno != EWOULDBLOCK) + redisLog(REDIS_WARNING, + "Accepting client connection: %s", server.neterr); + return; + } + redisLog(REDIS_VERBOSE,"Accepted %s:%d", cip, cport); + acceptCommonHandler(cfd,0); } - redisLog(REDIS_VERBOSE,"Accepted %s:%d", cip, cport); - acceptCommonHandler(cfd,0); } void acceptUnixHandler(aeEventLoop *el, int fd, void *privdata, int mask) { - int cfd; + int cfd, max = MAX_ACCEPTS_PER_CALL; REDIS_NOTUSED(el); REDIS_NOTUSED(mask); REDIS_NOTUSED(privdata); - cfd = anetUnixAccept(server.neterr, fd); - if (cfd == ANET_ERR) { - redisLog(REDIS_WARNING,"Accepting client connection: %s", server.neterr); - return; + while(max--) { + cfd = anetUnixAccept(server.neterr, fd); + if (cfd == ANET_ERR) { + if (errno != EWOULDBLOCK) + redisLog(REDIS_WARNING, + "Accepting client connection: %s", server.neterr); + return; + } + redisLog(REDIS_VERBOSE,"Accepted connection to %s", server.unixsocket); + acceptCommonHandler(cfd,REDIS_UNIX_SOCKET); } - redisLog(REDIS_VERBOSE,"Accepted connection to %s", server.unixsocket); - acceptCommonHandler(cfd,REDIS_UNIX_SOCKET); } - static void freeClientArgv(redisClient *c) { int j; for (j = 0; j < c->argc; j++) diff --git a/src/redis.c b/src/redis.c index bd66fcb9a1a5c8d2a738b9878e5f20b090a1fa17..21ac59968ea550c8957b6fd89b6ab41bb865243e 100644 --- a/src/redis.c +++ b/src/redis.c @@ -1542,10 +1542,16 @@ int listenToPort(int port, int *fds, int *count) { * server.bindaddr_count == 0. */ fds[*count] = anetTcp6Server(server.neterr,port,NULL, server.tcp_backlog); - if (fds[*count] != ANET_ERR) (*count)++; + if (fds[*count] != ANET_ERR) { + anetNonBlock(NULL,fds[*count]); + (*count)++; + } fds[*count] = anetTcpServer(server.neterr,port,NULL, server.tcp_backlog); - if (fds[*count] != ANET_ERR) (*count)++; + if (fds[*count] != ANET_ERR) { + anetNonBlock(NULL,fds[*count]); + (*count)++; + } /* Exit the loop if we were able to bind * on IPv4 or IPv6, * otherwise fds[*count] will be ANET_ERR and we'll print an * error and return to the caller with an error. */ @@ -1566,6 +1572,7 @@ int listenToPort(int port, int *fds, int *count) { server.port, server.neterr); return REDIS_ERR; } + anetNonBlock(NULL,fds[*count]); (*count)++; } return REDIS_OK; @@ -1632,6 +1639,7 @@ void initServer() { redisLog(REDIS_WARNING, "Opening socket: %s", server.neterr); exit(1); } + anetNonBlock(NULL,server.sofd); } /* Abort if there are no listening sockets at all. */