From 21c626ef2d79e937711a3be79ad298eda01ccabd Mon Sep 17 00:00:00 2001 From: Oran Agra Date: Thu, 5 Nov 2020 11:46:16 +0200 Subject: [PATCH] Better INFO fields to track diskless and disk-based replication progress (#7981) Expose new `loading_rdb_used_mem` showing the used memory of the server that saved the RDB file we're currently using. This is useful in diskless replication when the total size of the rdb is unkown, and can be used as a rought estimation of progres. Use that new field to calculate the "user friendly" `loading_loaded_perc` and `loading_eta_seconds`. Expose `master_sync_total_bytes` and `master_sync_total_bytes` to complement on the existing `master_sync_total_bytes` (which cannot be used on its own to calculate progress). Add "user friendly" field for `master_sync_perc` --- src/rdb.c | 2 ++ src/server.c | 35 +++++++++++++++++++++++++++-------- src/server.h | 1 + 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/rdb.c b/src/rdb.c index e15984e44..e3f34b3f0 100644 --- a/src/rdb.c +++ b/src/rdb.c @@ -2023,6 +2023,7 @@ void startLoading(size_t size, int rdbflags) { server.loading_start_time = time(NULL); server.loading_loaded_bytes = 0; server.loading_total_bytes = size; + server.loading_rdb_used_mem = 0; blockingOperationStarts(); /* Fire the loading modules start event. */ @@ -2238,6 +2239,7 @@ int rdbLoadRio(rio *rdb, int rdbflags, rdbSaveInfo *rsi) { long long usedmem = strtoll(auxval->ptr,NULL,10); serverLog(LL_NOTICE,"RDB memory usage when created %.2f Mb", (double) usedmem / (1024*1024)); + server.loading_rdb_used_mem = usedmem; } else if (!strcasecmp(auxkey->ptr,"aof-preamble")) { long long haspreamble = strtoll(auxval->ptr,NULL,10); if (haspreamble) serverLog(LL_NOTICE,"RDB has an AOF tail"); diff --git a/src/server.c b/src/server.c index 9aab1f39b..883a81305 100644 --- a/src/server.c +++ b/src/server.c @@ -2463,6 +2463,7 @@ void initServerConfig(void) { server.client_max_querybuf_len = PROTO_MAX_QUERYBUF_LEN; server.saveparams = NULL; server.loading = 0; + server.loading_rdb_used_mem = 0; server.logfile = zstrdup(CONFIG_DEFAULT_LOGFILE); server.aof_state = AOF_OFF; server.aof_rewrite_base_size = 0; @@ -4501,13 +4502,20 @@ sds genRedisInfoString(const char *section) { } if (server.loading) { - double perc; + double perc = 0; time_t eta, elapsed; - off_t remaining_bytes = server.loading_total_bytes- - server.loading_loaded_bytes; + off_t remaining_bytes = 1; - perc = ((double)server.loading_loaded_bytes / - (server.loading_total_bytes+1)) * 100; + if (server.loading_total_bytes) { + perc = ((double)server.loading_loaded_bytes / server.loading_total_bytes) * 100; + remaining_bytes = server.loading_total_bytes - server.loading_loaded_bytes; + } else if(server.loading_rdb_used_mem) { + perc = ((double)server.loading_loaded_bytes / server.loading_rdb_used_mem) * 100; + remaining_bytes = server.loading_rdb_used_mem - server.loading_loaded_bytes; + /* used mem is only a (bad) estimation of the rdb file size, avoid going over 100% */ + if (perc > 99.99) perc = 99.99; + if (remaining_bytes < 1) remaining_bytes = 1; + } elapsed = time(NULL)-server.loading_start_time; if (elapsed == 0) { @@ -4520,11 +4528,13 @@ sds genRedisInfoString(const char *section) { info = sdscatprintf(info, "loading_start_time:%jd\r\n" "loading_total_bytes:%llu\r\n" + "loading_rdb_used_mem:%llu\r\n" "loading_loaded_bytes:%llu\r\n" "loading_loaded_perc:%.2f\r\n" "loading_eta_seconds:%jd\r\n", (intmax_t) server.loading_start_time, (unsigned long long) server.loading_total_bytes, + (unsigned long long) server.loading_rdb_used_mem, (unsigned long long) server.loading_loaded_bytes, perc, (intmax_t)eta @@ -4649,11 +4659,20 @@ sds genRedisInfoString(const char *section) { ); if (server.repl_state == REPL_STATE_TRANSFER) { + double perc = 0; + if (server.repl_transfer_size) { + perc = ((double)server.repl_transfer_read / server.repl_transfer_size) * 100; + } info = sdscatprintf(info, + "master_sync_total_bytes:%lld\r\n" + "master_sync_read_bytes:%lld\r\n" "master_sync_left_bytes:%lld\r\n" - "master_sync_last_io_seconds_ago:%d\r\n" - , (long long) - (server.repl_transfer_size - server.repl_transfer_read), + "master_sync_perc:%.2f\r\n" + "master_sync_last_io_seconds_ago:%d\r\n", + (long long) server.repl_transfer_size, + (long long) server.repl_transfer_read, + (long long) (server.repl_transfer_size - server.repl_transfer_read), + perc, (int)(server.unixtime-server.repl_transfer_lastio) ); } diff --git a/src/server.h b/src/server.h index 7431c7a1e..5a37ad65b 100644 --- a/src/server.h +++ b/src/server.h @@ -1139,6 +1139,7 @@ struct redisServer { /* RDB / AOF loading information */ volatile sig_atomic_t loading; /* We are loading data from disk if true */ off_t loading_total_bytes; + off_t loading_rdb_used_mem; off_t loading_loaded_bytes; time_t loading_start_time; off_t loading_process_events_interval_bytes;