From 890a2ed989274cb09b5cde1def3935e110ec3cb9 Mon Sep 17 00:00:00 2001 From: Pieter Noordhuis Date: Sun, 22 May 2011 12:57:30 +0200 Subject: [PATCH] Configurable synchronous I/O timeout --- src/redis.c | 1 + src/redis.h | 4 ++++ src/replication.c | 8 ++++---- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/redis.c b/src/redis.c index 63b41ba8..f64a2d34 100644 --- a/src/redis.c +++ b/src/redis.c @@ -871,6 +871,7 @@ void initServerConfig() { server.masterport = 6379; server.master = NULL; server.replstate = REDIS_REPL_NONE; + server.repl_syncio_timeout = REDIS_REPL_SYNCIO_TIMEOUT; server.repl_serve_stale_data = 1; /* Double constants initialization */ diff --git a/src/redis.h b/src/redis.h index 19f0b516..f249d237 100644 --- a/src/redis.h +++ b/src/redis.h @@ -159,6 +159,9 @@ #define REDIS_REPL_TRANSFER 3 /* Receiving .rdb from master */ #define REDIS_REPL_CONNECTED 4 /* Connected to master */ +/* Synchronous read timeout - slave side */ +#define REDIS_REPL_SYNCIO_TIMEOUT 5 + /* Slave replication state - from the point of view of master * Note that in SEND_BULK and ONLINE state the slave receives new updates * in its output queue. In the WAIT_BGSAVE state instead the server is waiting @@ -586,6 +589,7 @@ struct redisServer { char *masterhost; int masterport; redisClient *master; /* client that is master for this slave */ + int repl_syncio_timeout; /* timeout for synchronous I/O calls */ int replstate; /* replication status if the instance is a slave */ off_t repl_transfer_left; /* bytes left reading .rdb */ int repl_transfer_s; /* slave -> master SYNC socket */ diff --git a/src/replication.c b/src/replication.c index 851a40f8..87d575ca 100644 --- a/src/replication.c +++ b/src/replication.c @@ -315,7 +315,7 @@ void readSyncBulkPayload(aeEventLoop *el, int fd, void *privdata, int mask) { /* If repl_transfer_left == -1 we still have to read the bulk length * from the master reply. */ if (server.repl_transfer_left == -1) { - if (syncReadLine(fd,buf,1024,3600) == -1) { + if (syncReadLine(fd,buf,1024,server.repl_syncio_timeout) == -1) { redisLog(REDIS_WARNING, "I/O error reading bulk count from MASTER: %s", strerror(errno)); @@ -414,13 +414,13 @@ void syncWithMaster(aeEventLoop *el, int fd, void *privdata, int mask) { size_t authlen; authlen = snprintf(authcmd,sizeof(authcmd),"AUTH %s\r\n",server.masterauth); - if (syncWrite(fd,authcmd,authlen,5) == -1) { + if (syncWrite(fd,authcmd,authlen,server.repl_syncio_timeout) == -1) { redisLog(REDIS_WARNING,"Unable to AUTH to MASTER: %s", strerror(errno)); goto error; } /* Read the AUTH result. */ - if (syncReadLine(fd,buf,1024,3600) == -1) { + if (syncReadLine(fd,buf,1024,server.repl_syncio_timeout) == -1) { redisLog(REDIS_WARNING,"I/O error reading auth result from MASTER: %s", strerror(errno)); goto error; @@ -432,7 +432,7 @@ void syncWithMaster(aeEventLoop *el, int fd, void *privdata, int mask) { } /* Issue the SYNC command */ - if (syncWrite(fd,"SYNC \r\n",7,5) == -1) { + if (syncWrite(fd,"SYNC \r\n",7,server.repl_syncio_timeout) == -1) { redisLog(REDIS_WARNING,"I/O error writing to MASTER: %s", strerror(errno)); goto error;