diff options
Diffstat (limited to 'src/object.c')
-rw-r--r-- | src/object.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/src/object.c b/src/object.c index 4c62df3f0..c2d917ae4 100644 --- a/src/object.c +++ b/src/object.c @@ -1172,20 +1172,34 @@ struct redisMemOverhead *getMemoryOverheadData(void) { mem_total += server.initial_memory_usage; - mem = 0; - if (server.repl_backlog) - mem += zmalloc_size(server.repl_backlog); - mh->repl_backlog = mem; - mem_total += mem; + /* Replication backlog and replicas share one global replication buffer, + * only if replication buffer memory is more than the repl backlog setting, + * we consider the excess as replicas' memory. Otherwise, replication buffer + * memory is the consumption of repl backlog. */ + if (listLength(server.slaves) && + (long long)server.repl_buffer_mem > server.repl_backlog_size) + { + mh->clients_slaves = server.repl_buffer_mem - server.repl_backlog_size; + mh->repl_backlog = server.repl_backlog_size; + } else { + mh->clients_slaves = 0; + mh->repl_backlog = server.repl_buffer_mem; + } + if (server.repl_backlog) { + /* The approximate memory of rax tree for indexed blocks. */ + mh->repl_backlog += + server.repl_backlog->blocks_index->numnodes * sizeof(raxNode) + + raxSize(server.repl_backlog->blocks_index) * sizeof(void*); + } + mem_total += mh->repl_backlog; + mem_total += mh->clients_slaves; /* Computing the memory used by the clients would be O(N) if done * here online. We use our values computed incrementally by * updateClientMemUsage(). */ - mh->clients_slaves = server.stat_clients_type_memory[CLIENT_TYPE_SLAVE]; mh->clients_normal = server.stat_clients_type_memory[CLIENT_TYPE_MASTER]+ server.stat_clients_type_memory[CLIENT_TYPE_PUBSUB]+ server.stat_clients_type_memory[CLIENT_TYPE_NORMAL]; - mem_total += mh->clients_slaves; mem_total += mh->clients_normal; mem = 0; @@ -1312,7 +1326,7 @@ sds getMemoryDoctorReport(void) { } /* Slaves using more than 10 MB each? */ - if (numslaves > 0 && mh->clients_slaves / numslaves > (1024*1024*10)) { + if (numslaves > 0 && mh->clients_slaves > (1024*1024*10)) { big_slave_buf = 1; num_reports++; } |