]> git.saurik.com Git - redis.git/commitdiff
Replication bug fixed: now non blocking connect is also forced to follow the configur...
authorantirez <antirez@gmail.com>
Wed, 30 Nov 2011 14:35:16 +0000 (15:35 +0100)
committerantirez <antirez@gmail.com>
Wed, 30 Nov 2011 14:35:16 +0000 (15:35 +0100)
src/replication.c

index 712af110f41a1e2435491c9899bf27ecfdc09a05..30df9bc82cc128e141c1999eac97210e9b2364be 100644 (file)
@@ -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)