Commit 55ba7727 authored by antirez's avatar antirez
Browse files

Fix replication slave pings period.

For PINGs we use the period configured by the user, but for the newlines
of slaves waiting for an RDB to be created (including slaves waiting for
the FULLRESYNC reply) we need to ping with frequency of 1 second, since
the timeout is fixed and needs to be refreshed.
parent 1d594973
...@@ -2009,6 +2009,8 @@ long long replicationGetSlaveOffset(void) { ...@@ -2009,6 +2009,8 @@ long long replicationGetSlaveOffset(void) {
/* Replication cron function, called 1 time per second. */ /* Replication cron function, called 1 time per second. */
void replicationCron(void) { void replicationCron(void) {
static long long replication_cron_loops = 0;
/* Non blocking connection timeout? */ /* Non blocking connection timeout? */
if (server.masterhost && if (server.masterhost &&
(server.repl_state == REPL_STATE_CONNECTING || (server.repl_state == REPL_STATE_CONNECTING ||
...@@ -2055,31 +2057,34 @@ void replicationCron(void) { ...@@ -2055,31 +2057,34 @@ void replicationCron(void) {
* So slaves can implement an explicit timeout to masters, and will * So slaves can implement an explicit timeout to masters, and will
* be able to detect a link disconnection even if the TCP connection * be able to detect a link disconnection even if the TCP connection
* will not actually go down. */ * will not actually go down. */
if (!(server.cronloops % (server.repl_ping_slave_period * server.hz))) { listIter li;
listIter li; listNode *ln;
listNode *ln; robj *ping_argv[1];
robj *ping_argv[1];
/* First, send PING */ /* First, send PING according to ping_slave_period. */
if ((replication_cron_loops % server.repl_ping_slave_period) == 0) {
ping_argv[0] = createStringObject("PING",4); ping_argv[0] = createStringObject("PING",4);
replicationFeedSlaves(server.slaves, server.slaveseldb, ping_argv, 1); replicationFeedSlaves(server.slaves, server.slaveseldb,
ping_argv, 1);
decrRefCount(ping_argv[0]); decrRefCount(ping_argv[0]);
}
/* Second, send a newline to all the slaves in pre-synchronization /* Second, send a newline to all the slaves in pre-synchronization
* stage, that is, slaves waiting for the master to create the RDB file. * stage, that is, slaves waiting for the master to create the RDB file.
* The newline will be ignored by the slave but will refresh the * The newline will be ignored by the slave but will refresh the
* last-io timer preventing a timeout. */ * last-io timer preventing a timeout. In this case we ignore the
listRewind(server.slaves,&li); * ping period and refresh the connection once per second since certain
while((ln = listNext(&li))) { * timeouts are set at a few seconds (example: PSYNC response). */
client *slave = ln->value; listRewind(server.slaves,&li);
while((ln = listNext(&li))) {
client *slave = ln->value;
if (slave->replstate == SLAVE_STATE_WAIT_BGSAVE_START || if (slave->replstate == SLAVE_STATE_WAIT_BGSAVE_START ||
(slave->replstate == SLAVE_STATE_WAIT_BGSAVE_END && (slave->replstate == SLAVE_STATE_WAIT_BGSAVE_END &&
server.rdb_child_type != RDB_CHILD_TYPE_SOCKET)) server.rdb_child_type != RDB_CHILD_TYPE_SOCKET))
{ {
if (write(slave->fd, "\n", 1) == -1) { if (write(slave->fd, "\n", 1) == -1) {
/* Don't worry, it's just a ping. */ /* Don't worry, it's just a ping. */
}
} }
} }
} }
...@@ -2176,4 +2181,5 @@ void replicationCron(void) { ...@@ -2176,4 +2181,5 @@ void replicationCron(void) {
/* Refresh the number of slaves with lag <= min-slaves-max-lag. */ /* Refresh the number of slaves with lag <= min-slaves-max-lag. */
refreshGoodSlavesCount(); refreshGoodSlavesCount();
replication_cron_loops++; /* Incremented with frequency 1 HZ. */
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment