summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuy Benoish <guy.benoish@redislabs.com>2020-02-06 14:09:45 +0530
committerantirez <antirez@gmail.com>2020-03-05 16:29:08 +0100
commit708a4e8a9bdd9de1cb9ebd3f7f10baffd3419b9e (patch)
tree959bb34523ef53c60b17a810d2c8ac9f212c8319
parenteac4115d3639663701ebdbf6c42b2fc9c405b3c1 (diff)
downloadredis-708a4e8a9bdd9de1cb9ebd3f7f10baffd3419b9e.tar.gz
Fix small bugs related to replica and monitor ambiguity
1. server.repl_no_slaves_since can be set when a MONITOR client disconnects 2. c->repl_ack_time can be set by a newline from a MONITOR client 3. Improved comments
-rw-r--r--src/networking.c12
-rw-r--r--src/server.c2
2 files changed, 8 insertions, 6 deletions
diff --git a/src/networking.c b/src/networking.c
index 59421e94d..bfaded9b4 100644
--- a/src/networking.c
+++ b/src/networking.c
@@ -918,7 +918,7 @@ void freeClient(client *c) {
/* We need to remember the time when we started to have zero
* attached slaves, as after some time we'll free the replication
* backlog. */
- if (c->flags & CLIENT_SLAVE && listLength(server.slaves) == 0)
+ if (getClientType(c) == CLIENT_TYPE_SLAVE && listLength(server.slaves) == 0)
server.repl_no_slaves_since = server.unixtime;
refreshGoodSlavesCount();
}
@@ -1030,8 +1030,8 @@ int writeToClient(int fd, client *c, int handler_installed) {
* just deliver as much data as it is possible to deliver.
*
* Moreover, we also send as much as possible if the client is
- * a slave (otherwise, on high-speed traffic, the replication
- * buffer will grow indefinitely) */
+ * a slave or a monitor (otherwise, on high-speed traffic, the
+ * replication/output buffer will grow indefinitely) */
if (totwritten > NET_MAX_WRITES_PER_EVENT &&
(server.maxmemory == 0 ||
zmalloc_used_memory() < server.maxmemory) &&
@@ -1216,7 +1216,7 @@ int processInlineBuffer(client *c) {
/* Newline from slaves can be used to refresh the last ACK time.
* This is useful for a slave to ping back while loading a big
* RDB file. */
- if (querylen == 0 && c->flags & CLIENT_SLAVE)
+ if (querylen == 0 && getClientType(c) == CLIENT_TYPE_SLAVE)
c->repl_ack_time = server.unixtime;
/* Move querybuffer position to the next query in the buffer. */
@@ -2033,12 +2033,14 @@ unsigned long getClientOutputBufferMemoryUsage(client *c) {
*
* The function will return one of the following:
* CLIENT_TYPE_NORMAL -> Normal client
- * CLIENT_TYPE_SLAVE -> Slave or client executing MONITOR command
+ * CLIENT_TYPE_SLAVE -> Slave
* CLIENT_TYPE_PUBSUB -> Client subscribed to Pub/Sub channels
* CLIENT_TYPE_MASTER -> The client representing our replication master.
*/
int getClientType(client *c) {
if (c->flags & CLIENT_MASTER) return CLIENT_TYPE_MASTER;
+ /* Even though MONITOR clients are marked as replicas, we
+ * want the expose them as normal clients. */
if ((c->flags & CLIENT_SLAVE) && !(c->flags & CLIENT_MONITOR))
return CLIENT_TYPE_SLAVE;
if (c->flags & CLIENT_PUBSUB) return CLIENT_TYPE_PUBSUB;
diff --git a/src/server.c b/src/server.c
index 280470f63..f6faa61a5 100644
--- a/src/server.c
+++ b/src/server.c
@@ -821,7 +821,7 @@ int clientsCronHandleTimeout(client *c, mstime_t now_ms) {
time_t now = now_ms/1000;
if (server.maxidletime &&
- !(c->flags & CLIENT_SLAVE) && /* no timeout for slaves */
+ !(c->flags & CLIENT_SLAVE) && /* no timeout for slaves and monitors */
!(c->flags & CLIENT_MASTER) && /* no timeout for masters */
!(c->flags & CLIENT_BLOCKED) && /* no timeout for BLPOP */
!(c->flags & CLIENT_PUBSUB) && /* no timeout for Pub/Sub clients */