summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSalvatore Sanfilippo <antirez@gmail.com>2020-02-06 10:21:30 +0100
committerGitHub <noreply@github.com>2020-02-06 10:21:30 +0100
commit15c7f1317efa00cf7111163bd3bdd16af3fb2be0 (patch)
treebc418040dbbfd0e5b29d7f3569be29ca4a876053
parentedfe1b2f8b6ff2c93c5a1db007ea033dd710d98a (diff)
parent91c41b6ddee22eec7757a60fc87c24fd5087306a (diff)
downloadredis-15c7f1317efa00cf7111163bd3bdd16af3fb2be0.tar.gz
Merge pull request #6854 from guybe7/mem_overhead_miscalc
Fix small bugs related to replica and monitor ambiguity
-rw-r--r--src/networking.c21
-rw-r--r--src/object.c35
-rw-r--r--src/server.c2
3 files changed, 26 insertions, 32 deletions
diff --git a/src/networking.c b/src/networking.c
index a2e454d4b..496b0f3dc 100644
--- a/src/networking.c
+++ b/src/networking.c
@@ -369,9 +369,10 @@ void addReplyErrorLength(client *c, const char *s, size_t len) {
* Where the master must propagate the first change even if the second
* will produce an error. However it is useful to log such events since
* they are rare and may hint at errors in a script or a bug in Redis. */
- if (c->flags & (CLIENT_MASTER|CLIENT_SLAVE) && !(c->flags & CLIENT_MONITOR)) {
- char* to = c->flags & CLIENT_MASTER? "master": "replica";
- char* from = c->flags & CLIENT_MASTER? "replica": "master";
+ int ctype = getClientType(c);
+ if (ctype == CLIENT_TYPE_MASTER || ctype == CLIENT_TYPE_SLAVE) {
+ char* to = ctype == CLIENT_TYPE_MASTER? "master": "replica";
+ char* from = ctype == CLIENT_TYPE_MASTER? "replica": "master";
char *cmdname = c->lastcmd ? c->lastcmd->name : "<unknown>";
serverLog(LL_WARNING,"== CRITICAL == This %s is sending an error "
"to its %s: '%s' after processing the command "
@@ -1074,7 +1075,7 @@ void freeClient(client *c) {
}
/* Log link disconnection with slave */
- if ((c->flags & CLIENT_SLAVE) && !(c->flags & CLIENT_MONITOR)) {
+ if (getClientType(c) == CLIENT_TYPE_SLAVE) {
serverLog(LL_WARNING,"Connection with replica %s lost.",
replicationGetSlaveName(c));
}
@@ -1121,7 +1122,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();
/* Fire the replica change modules event. */
@@ -1252,8 +1253,8 @@ int writeToClient(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) &&
@@ -1439,7 +1440,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. */
@@ -2433,12 +2434,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/object.c b/src/object.c
index 52007b474..cc6b218a0 100644
--- a/src/object.c
+++ b/src/object.c
@@ -975,37 +975,28 @@ struct redisMemOverhead *getMemoryOverheadData(void) {
mem_total += mem;
mem = 0;
- if (listLength(server.slaves)) {
- listIter li;
- listNode *ln;
-
- listRewind(server.slaves,&li);
- while((ln = listNext(&li))) {
- client *c = listNodeValue(ln);
- mem += getClientOutputBufferMemoryUsage(c);
- mem += sdsAllocSize(c->querybuf);
- mem += sizeof(client);
- }
- }
- mh->clients_slaves = mem;
- mem_total+=mem;
-
- mem = 0;
if (listLength(server.clients)) {
listIter li;
listNode *ln;
+ size_t mem_normal = 0, mem_slaves = 0;
listRewind(server.clients,&li);
while((ln = listNext(&li))) {
+ size_t mem_curr = 0;
client *c = listNodeValue(ln);
- if (c->flags & CLIENT_SLAVE && !(c->flags & CLIENT_MONITOR))
- continue;
- mem += getClientOutputBufferMemoryUsage(c);
- mem += sdsAllocSize(c->querybuf);
- mem += sizeof(client);
+ int type = getClientType(c);
+ mem_curr += getClientOutputBufferMemoryUsage(c);
+ mem_curr += sdsAllocSize(c->querybuf);
+ mem_curr += sizeof(client);
+ if (type == CLIENT_TYPE_SLAVE)
+ mem_slaves += mem_curr;
+ else
+ mem_normal += mem_curr;
}
+ mh->clients_slaves = mem_slaves;
+ mh->clients_normal = mem_normal;
+ mem = mem_slaves + mem_normal;
}
- mh->clients_normal = mem;
mem_total+=mem;
mem = 0;
diff --git a/src/server.c b/src/server.c
index f3b7c37c5..2b32df0db 100644
--- a/src/server.c
+++ b/src/server.c
@@ -1498,7 +1498,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 */