summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/networking.c38
-rw-r--r--src/redis.c12
2 files changed, 33 insertions, 17 deletions
diff --git a/src/networking.c b/src/networking.c
index 81b66f914..6de7fc12c 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 bd66fcb9a..21ac59968 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. */