mirror of
https://github.com/fluencelabs/redis
synced 2025-06-12 16:51:22 +00:00
Emit SELECT to slaves in a centralized way.
Before this commit every Redis slave had its own selected database ID state. This was not actually useful as the emitted stream of commands is identical for all the slaves. Now the the currently selected database is a global state that is set to -1 when a new slave is attached, in order to force the SELECT command to be re-emitted for all the slaves. This change is useful in order to implement replication partial resynchronization in the future, as makes sure that the stream of commands received by slaves, including SELECT commands, are exactly the same for every slave connected, at any time. In this way we could have a global offset that can identify a specific piece of the master -> slaves stream of commands.
This commit is contained in:
@ -54,7 +54,7 @@ void replicationFeedSlaves(list *slaves, int dictid, robj **argv, int argc) {
|
||||
/* Feed slaves that are waiting for the initial SYNC (so these commands
|
||||
* are queued in the output buffer until the initial SYNC completes),
|
||||
* or are already in sync with the master. */
|
||||
if (slave->slaveseldb != dictid) {
|
||||
if (server.slaveseldb != dictid) {
|
||||
robj *selectcmd;
|
||||
|
||||
if (dictid >= 0 && dictid < REDIS_SHARED_SELECT_CMDS) {
|
||||
@ -66,11 +66,11 @@ void replicationFeedSlaves(list *slaves, int dictid, robj **argv, int argc) {
|
||||
}
|
||||
addReply(slave,selectcmd);
|
||||
decrRefCount(selectcmd);
|
||||
slave->slaveseldb = dictid;
|
||||
}
|
||||
addReplyMultiBulkLen(slave,argc);
|
||||
for (j = 0; j < argc; j++) addReplyBulk(slave,argv[j]);
|
||||
}
|
||||
server.slaveseldb = dictid;
|
||||
}
|
||||
|
||||
void replicationFeedMonitors(redisClient *c, list *monitors, int dictid, robj **argv, int argc) {
|
||||
@ -177,7 +177,7 @@ void syncCommand(redisClient *c) {
|
||||
anetDisableTcpNoDelay(NULL, c->fd); /* Non critical if it fails. */
|
||||
c->repldbfd = -1;
|
||||
c->flags |= REDIS_SLAVE;
|
||||
c->slaveseldb = 0;
|
||||
server.slaveseldb = -1; /* Force to re-emit the SELECT command. */
|
||||
listAddNodeTail(server.slaves,c);
|
||||
return;
|
||||
}
|
||||
|
Reference in New Issue
Block a user