mirror of
https://github.com/fluencelabs/redis
synced 2025-03-30 22:31:03 +00:00
Replication bug fixed: now non blocking connect is also forced to follow the configured replication timeout.
This commit is contained in:
parent
c6f9ee88fa
commit
27acd7aa89
@ -471,11 +471,24 @@ int connectWithMaster(void) {
|
|||||||
return REDIS_ERR;
|
return REDIS_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
server.repl_transfer_lastio = time(NULL);
|
||||||
server.repl_transfer_s = fd;
|
server.repl_transfer_s = fd;
|
||||||
server.replstate = REDIS_REPL_CONNECTING;
|
server.replstate = REDIS_REPL_CONNECTING;
|
||||||
return REDIS_OK;
|
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) {
|
void slaveofCommand(redisClient *c) {
|
||||||
if (!strcasecmp(c->argv[1]->ptr,"no") &&
|
if (!strcasecmp(c->argv[1]->ptr,"no") &&
|
||||||
!strcasecmp(c->argv[2]->ptr,"one")) {
|
!strcasecmp(c->argv[2]->ptr,"one")) {
|
||||||
@ -485,6 +498,8 @@ void slaveofCommand(redisClient *c) {
|
|||||||
if (server.master) freeClient(server.master);
|
if (server.master) freeClient(server.master);
|
||||||
if (server.replstate == REDIS_REPL_TRANSFER)
|
if (server.replstate == REDIS_REPL_TRANSFER)
|
||||||
replicationAbortSyncTransfer();
|
replicationAbortSyncTransfer();
|
||||||
|
else if (server.replstate == REDIS_REPL_CONNECTING)
|
||||||
|
undoConnectWithMaster();
|
||||||
server.replstate = REDIS_REPL_NONE;
|
server.replstate = REDIS_REPL_NONE;
|
||||||
redisLog(REDIS_NOTICE,"MASTER MODE enabled (user request)");
|
redisLog(REDIS_NOTICE,"MASTER MODE enabled (user request)");
|
||||||
}
|
}
|
||||||
@ -505,6 +520,14 @@ void slaveofCommand(redisClient *c) {
|
|||||||
/* --------------------------- REPLICATION CRON ---------------------------- */
|
/* --------------------------- REPLICATION CRON ---------------------------- */
|
||||||
|
|
||||||
void replicationCron(void) {
|
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? */
|
/* Bulk transfer I/O timeout? */
|
||||||
if (server.masterhost && server.replstate == REDIS_REPL_TRANSFER &&
|
if (server.masterhost && server.replstate == REDIS_REPL_TRANSFER &&
|
||||||
(time(NULL)-server.repl_transfer_lastio) > server.repl_timeout)
|
(time(NULL)-server.repl_transfer_lastio) > server.repl_timeout)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user