summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSalvatore Sanfilippo <antirez@gmail.com>2015-10-15 09:51:28 +0200
committerSalvatore Sanfilippo <antirez@gmail.com>2015-10-15 09:51:28 +0200
commitdb98e549823fe9d0dd39edfdbd7862d7c0164ba4 (patch)
tree09b0c5de089cc92f07ce0fed255b0dbc6da6b239
parent560142e6a71272170f4f8a1535ddc600d982ad2f (diff)
parent3e0b34cf6dbf0803f5d7aa9617a3c4497bcb5959 (diff)
downloadredis-db98e549823fe9d0dd39edfdbd7862d7c0164ba4.tar.gz
Merge pull request #2813 from kevinmcgehee/2.8
Fix master timeout during handshake
-rw-r--r--src/replication.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/src/replication.c b/src/replication.c
index 55a0340fa..3c642f0b7 100644
--- a/src/replication.c
+++ b/src/replication.c
@@ -41,6 +41,7 @@ void replicationDiscardCachedMaster(void);
void replicationResurrectCachedMaster(int newfd);
void replicationSendAck(void);
void putSlaveOnline(redisClient *slave);
+int serverInHandshakeState(int repl_state);
/* --------------------------- Utility functions ---------------------------- */
@@ -1190,6 +1191,7 @@ char *sendSynchronousCommand(int flags, int fd, ...) {
return sdscatprintf(sdsempty(),"-Reading from master: %s",
strerror(errno));
}
+ server.repl_transfer_lastio = server.unixtime;
return sdsnew(buf);
}
return NULL;
@@ -1619,7 +1621,7 @@ void undoConnectWithMaster(void) {
int fd = server.repl_transfer_s;
redisAssert(server.repl_state == REDIS_REPL_CONNECTING ||
- server.repl_state == REDIS_REPL_RECEIVE_PONG);
+ serverInHandshakeState(server.repl_state));
aeDeleteFileEvent(server.el,fd,AE_READABLE|AE_WRITABLE);
close(fd);
server.repl_transfer_s = -1;
@@ -1638,7 +1640,7 @@ int cancelReplicationHandshake(void) {
if (server.repl_state == REDIS_REPL_TRANSFER) {
replicationAbortSyncTransfer();
} else if (server.repl_state == REDIS_REPL_CONNECTING ||
- server.repl_state == REDIS_REPL_RECEIVE_PONG)
+ serverInHandshakeState(server.repl_state))
{
undoConnectWithMaster();
} else {
@@ -1810,6 +1812,20 @@ void roleCommand(redisClient *c) {
}
}
+/* Returns 1 if the given replication state is a handshake state,
+ * 0 otherwise. */
+int serverInHandshakeState(int repl_state) {
+ return repl_state == REDIS_REPL_RECEIVE_PONG ||
+ repl_state == REDIS_REPL_SEND_AUTH ||
+ repl_state == REDIS_REPL_RECEIVE_AUTH ||
+ repl_state == REDIS_REPL_SEND_PORT ||
+ repl_state == REDIS_REPL_RECEIVE_PORT ||
+ repl_state == REDIS_REPL_SEND_CAPA ||
+ repl_state == REDIS_REPL_RECEIVE_CAPA ||
+ repl_state == REDIS_REPL_SEND_PSYNC ||
+ repl_state == REDIS_REPL_RECEIVE_PSYNC;
+}
+
/* Send a REPLCONF ACK command to the master to inform it about the current
* processed offset. If we are not connected with a master, the command has
* no effects. */
@@ -2045,7 +2061,7 @@ void replicationCron(void) {
/* Non blocking connection timeout? */
if (server.masterhost &&
(server.repl_state == REDIS_REPL_CONNECTING ||
- server.repl_state == REDIS_REPL_RECEIVE_PONG) &&
+ serverInHandshakeState(server.repl_state)) &&
(time(NULL)-server.repl_transfer_lastio) > server.repl_timeout)
{
redisLog(REDIS_WARNING,"Timeout connecting to the MASTER...");