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;