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`
This commit is contained in:
parent
1fd456f91a
commit
7ace7231c6
@ -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");
|
||||
|
35
src/server.c
35
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)
|
||||
);
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user