From 27acd7aa89c50a207f500fb0d0fb7194ae05812a Mon Sep 17 00:00:00 2001 From: antirez Date: Wed, 30 Nov 2011 15:35:16 +0100 Subject: [PATCH] Replication bug fixed: now non blocking connect is also forced to follow the configured replication timeout. --- src/replication.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/replication.c b/src/replication.c index 712af110..30df9bc8 100644 --- a/src/replication.c +++ b/src/replication.c @@ -471,11 +471,24 @@ int connectWithMaster(void) { return REDIS_ERR; } + server.repl_transfer_lastio = time(NULL); server.repl_transfer_s = fd; server.replstate = REDIS_REPL_CONNECTING; return REDIS_OK; } +/* This function can be called when a non blocking connection is currently + * in progress to undo it. */ +void undoConnectWithMaster(void) { + int fd = server.repl_transfer_s; + + redisAssert(server.replstate == REDIS_REPL_CONNECTING); + aeDeleteFileEvent(server.el,fd,AE_READABLE|AE_WRITABLE); + close(fd); + server.repl_transfer_s = -1; + server.replstate = REDIS_REPL_CONNECT; +} + void slaveofCommand(redisClient *c) { if (!strcasecmp(c->argv[1]->ptr,"no") && !strcasecmp(c->argv[2]->ptr,"one")) { @@ -485,6 +498,8 @@ void slaveofCommand(redisClient *c) { if (server.master) freeClient(server.master); if (server.replstate == REDIS_REPL_TRANSFER) replicationAbortSyncTransfer(); + else if (server.replstate == REDIS_REPL_CONNECTING) + undoConnectWithMaster(); server.replstate = REDIS_REPL_NONE; redisLog(REDIS_NOTICE,"MASTER MODE enabled (user request)"); } @@ -505,6 +520,14 @@ void slaveofCommand(redisClient *c) { /* --------------------------- REPLICATION CRON ---------------------------- */ void replicationCron(void) { + /* Non blocking connection timeout? */ + if (server.masterhost && server.replstate == REDIS_REPL_CONNECTING && + (time(NULL)-server.repl_transfer_lastio) > server.repl_timeout) + { + redisLog(REDIS_WARNING,"Timeout connecting to the MASTER..."); + undoConnectWithMaster(); + } + /* Bulk transfer I/O timeout? */ if (server.masterhost && server.replstate == REDIS_REPL_TRANSFER && (time(NULL)-server.repl_transfer_lastio) > server.repl_timeout) -- 2.47.2