提交 179e54d2 编写于 作者: A antirez

Fix for slaves chains. Force resync of slaves (simply disconnecting them) ...

Fix for slaves chains. Force resync of slaves (simply disconnecting them)  when SLAVEOF turns a master into a slave.
上级 6aa2f989
...@@ -547,6 +547,16 @@ static void freeClientArgv(redisClient *c) { ...@@ -547,6 +547,16 @@ static void freeClientArgv(redisClient *c) {
c->cmd = NULL; 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) { void freeClient(redisClient *c) {
listNode *ln; listNode *ln;
...@@ -605,21 +615,12 @@ void freeClient(redisClient *c) { ...@@ -605,21 +615,12 @@ void freeClient(redisClient *c) {
server.master = NULL; server.master = NULL;
server.repl_state = REDIS_REPL_CONNECT; server.repl_state = REDIS_REPL_CONNECT;
server.repl_down_since = server.unixtime; server.repl_down_since = server.unixtime;
/* Since we lost the connection with the master, we should also /* We lost connection with our master, force our slaves to resync
* close the connection with all our slaves if we have any, so * with us as well to load the new data set.
* 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 do this only if server.masterhost != NULL. If it is NULL this * If server.masterhost is NULL te user called SLAVEOF NO ONE so
* means the user called SLAVEOF NO ONE and we are freeing our * slave resync is not needed. */
* link with the master, so no need to close link with slaves. */ if (server.masterhost != NULL) disconnectSlaves();
if (server.masterhost != NULL) {
while (listLength(server.slaves)) {
ln = listFirst(server.slaves);
freeClient((redisClient*)ln->value);
}
}
} }
/* If this client was scheduled for async freeing we need to remove it /* If this client was scheduled for async freeing we need to remove it
......
...@@ -869,6 +869,7 @@ void asyncCloseClientOnOutputBufferLimitReached(redisClient *c); ...@@ -869,6 +869,7 @@ void asyncCloseClientOnOutputBufferLimitReached(redisClient *c);
int getClientLimitClassByName(char *name); int getClientLimitClassByName(char *name);
char *getClientLimitClassName(int class); char *getClientLimitClassName(int class);
void flushSlavesOutputBuffers(void); void flushSlavesOutputBuffers(void);
void disconnectSlaves(void);
#ifdef __GNUC__ #ifdef __GNUC__
void addReplyErrorFormat(redisClient *c, const char *fmt, ...) void addReplyErrorFormat(redisClient *c, const char *fmt, ...)
......
...@@ -541,6 +541,7 @@ void slaveofCommand(redisClient *c) { ...@@ -541,6 +541,7 @@ void slaveofCommand(redisClient *c) {
server.masterhost = sdsdup(c->argv[1]->ptr); server.masterhost = sdsdup(c->argv[1]->ptr);
server.masterport = port; server.masterport = port;
if (server.master) freeClient(server.master); if (server.master) freeClient(server.master);
disconnectSlaves(); /* Force our slaves to resync with us as well. */
if (server.repl_state == REDIS_REPL_TRANSFER) if (server.repl_state == REDIS_REPL_TRANSFER)
replicationAbortSyncTransfer(); replicationAbortSyncTransfer();
server.repl_state = REDIS_REPL_CONNECT; server.repl_state = REDIS_REPL_CONNECT;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册