mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-22 16:18:28 -05:00
Fix for slaves chains. Force resync of slaves (simply disconnecting them) when SLAVEOF turns a master into a slave.
This commit is contained in:
parent
6aa2f98938
commit
179e54d2a9
@ -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) {
|
|||||||
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);
|
|||||||
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) {
|
|||||||
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user