summaryrefslogtreecommitdiff
path: root/src/networking.c
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2012-03-29 09:24:02 +0200
committerantirez <antirez@gmail.com>2012-03-29 09:24:02 +0200
commit179e54d2a9c6545d6f102bf9a3f9506175639743 (patch)
tree6c9d62696bfb66a70d5ee3980f832b63ab39dc5e /src/networking.c
parent6aa2f98938955788c3f56e1ce8fef691233bca35 (diff)
downloadredis-179e54d2a9c6545d6f102bf9a3f9506175639743.tar.gz
Fix for slaves chains. Force resync of slaves (simply disconnecting them) when SLAVEOF turns a master into a slave.
Diffstat (limited to 'src/networking.c')
-rw-r--r--src/networking.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/src/networking.c b/src/networking.c
index 937f8402a..406d1cde3 100644
--- a/src/networking.c
+++ b/src/networking.c
@@ -547,6 +547,16 @@ static void freeClientArgv(redisClient *c) {
c->cmd = NULL;
}
+/* Close all the slaves connections. This is useful in chained replication
+ * when we resync with our own master and want to force all our slaves to
+ * resync with us as well. */
+void disconnectSlaves(void) {
+ while (listLength(server.slaves)) {
+ listNode *ln = listFirst(server.slaves);
+ freeClient((redisClient*)ln->value);
+ }
+}
+
void freeClient(redisClient *c) {
listNode *ln;
@@ -605,21 +615,12 @@ void freeClient(redisClient *c) {
server.master = NULL;
server.repl_state = REDIS_REPL_CONNECT;
server.repl_down_since = server.unixtime;
- /* Since we lost the connection with the master, we should also
- * close the connection with all our slaves if we have any, so
- * when we'll resync with the master the other slaves will sync again
- * with us as well. Note that also when the slave is not connected
- * to the master it will keep refusing connections by other slaves.
+ /* We lost connection with our master, force our slaves to resync
+ * with us as well to load the new data set.
*
- * We do this only if server.masterhost != NULL. If it is NULL this
- * means the user called SLAVEOF NO ONE and we are freeing our
- * link with the master, so no need to close link with slaves. */
- if (server.masterhost != NULL) {
- while (listLength(server.slaves)) {
- ln = listFirst(server.slaves);
- freeClient((redisClient*)ln->value);
- }
- }
+ * If server.masterhost is NULL te user called SLAVEOF NO ONE so
+ * slave resync is not needed. */
+ if (server.masterhost != NULL) disconnectSlaves();
}
/* If this client was scheduled for async freeing we need to remove it