summaryrefslogtreecommitdiff
path: root/src/object.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/object.c')
-rw-r--r--src/object.c30
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++;
}