diff --git a/src/redis.c b/src/redis.c index 43fec05a699f13c1ee3a93f9f8573d586c04e59d..efce1f63ed1c5fa0cc3cf4c86989ffdb6ce3a575 100644 --- a/src/redis.c +++ b/src/redis.c @@ -1305,6 +1305,7 @@ void initServer() { server.clients_to_close = listCreate(); server.slaves = listCreate(); server.monitors = listCreate(); + server.slaveseldb = -1; /* Force to emit the first SELECT command. */ server.unblocked_clients = listCreate(); server.ready_keys = listCreate(); @@ -2287,7 +2288,6 @@ void monitorCommand(redisClient *c) { if (c->flags & REDIS_SLAVE) return; c->flags |= (REDIS_SLAVE|REDIS_MONITOR); - c->slaveseldb = 0; listAddNodeTail(server.monitors,c); addReply(c,shared.ok); } diff --git a/src/redis.h b/src/redis.h index 19fe37acef676d5affa4060125323d29d9eb9ac3..eafa93a0a8f896d075b0bfb6be957487c3f65a0c 100644 --- a/src/redis.h +++ b/src/redis.h @@ -412,7 +412,6 @@ typedef struct redisClient { time_t lastinteraction; /* time of the last interaction, used for timeout */ time_t obuf_soft_limit_reached_time; int flags; /* REDIS_SLAVE | REDIS_MONITOR | REDIS_MULTI ... */ - int slaveseldb; /* slave selected db, if this client is a slave */ int authenticated; /* when requirepass is non-NULL */ int replstate; /* replication state if this is a slave */ int repldbfd; /* replication DB file descriptor */ @@ -663,6 +662,7 @@ struct redisServer { list *clients; /* List of active clients */ list *clients_to_close; /* Clients to close asynchronously */ list *slaves, *monitors; /* List of slaves and MONITORs */ + int slaveseldb; /* Last SELECTed DB in replication output */ redisClient *current_client; /* Current client, only used on crash report */ char neterr[ANET_ERR_LEN]; /* Error buffer for anet.c */ dict *migrate_cached_sockets;/* MIGRATE cached sockets */ diff --git a/src/replication.c b/src/replication.c index a6abd0b949334c1109aea029f0193e5527eaaf70..71b2921f042893b79fe58ae391190ea65c665f70 100644 --- a/src/replication.c +++ b/src/replication.c @@ -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; }