Rewrite huge printf calls to smaller ones for readability (#12257)
In a long printf call with many placeholders, it's hard to see which argument belongs to which placeholder. The long printf-like calls in the INFO and CLIENT commands are rewritten into pairs of (format, argument). These pairs are then rewritten to a single call with a long format string and a long list of arguments, using a macro called FMTARGS. The file `fmtargs.h` is added to the repo. Co-authored-by: Madelyn Olson <34459052+madolson@users.noreply.github.com>
This commit is contained in:
parent
9fe63bdc80
commit
f924bebd83
@ -435,11 +435,16 @@ DEP = $(REDIS_SERVER_OBJ:%.o=%.d) $(REDIS_CLI_OBJ:%.o=%.d) $(REDIS_BENCHMARK_OBJ
|
||||
%.o: %.c .make-prerequisites
|
||||
$(REDIS_CC) -MMD -o $@ -c $<
|
||||
|
||||
# The file commands.def is checked in and doesn't normally need to be rebuilt. It
|
||||
# is built only if python is available and its prereqs are modified.
|
||||
# The following files are checked in and don't normally need to be rebuilt. They
|
||||
# are built only if python is available and their prereqs are modified.
|
||||
ifneq (,$(PYTHON))
|
||||
$(COMMANDS_DEF_FILENAME).def: commands/*.json ../utils/generate-command-code.py
|
||||
$(QUIET_GEN)$(PYTHON) ../utils/generate-command-code.py $(GEN_COMMANDS_FLAGS)
|
||||
|
||||
fmtargs.h: ../utils/generate-fmtargs.py
|
||||
$(QUITE_GEN)sed '/Everything below this line/,$$d' $@ > $@.tmp
|
||||
$(QUITE_GEN)$(PYTHON) ../utils/generate-fmtargs.py >> $@.tmp
|
||||
$(QUITE_GEN)mv $@.tmp $@
|
||||
endif
|
||||
|
||||
commands.c: $(COMMANDS_DEF_FILENAME).def
|
||||
|
173
src/fmtargs.h
Normal file
173
src/fmtargs.h
Normal file
@ -0,0 +1,173 @@
|
||||
/*
|
||||
* Copyright Redis Contributors.
|
||||
* All rights reserved.
|
||||
* SPDX-License-Identifier: BSD 3-Clause
|
||||
*
|
||||
* To make it easier to map each part of the format string with each argument,
|
||||
* this file provides a way to write
|
||||
*
|
||||
* printf("a = %s, b = %s, c = %s\n",
|
||||
* arg1, arg2, arg3);
|
||||
*
|
||||
* as
|
||||
*
|
||||
* printf(FMTARGS("a = %s, ", arg1,
|
||||
* "b = %s, ", arg2,
|
||||
* "c = %s\n", arg3));
|
||||
*
|
||||
* FMTARGS is variadic macro which is implemented by passing on its arguments to
|
||||
* two other variadic macros of which one extracts the odd (the formats) and the
|
||||
* other extracts the even (the arguments). The definitions of these macros
|
||||
* include counting the number of macro arguments. Therefore, they don't accept
|
||||
* an unlimited number of arguments. Currently it is fixed to a maximum of 120
|
||||
* formats and arguments.
|
||||
*/
|
||||
#ifndef FMTARGS_H
|
||||
#define FMTARGS_H
|
||||
|
||||
/* A macro to count the number of arguments. */
|
||||
#define NARG(...) NARG_I(__VA_ARGS__,RSEQ_N())
|
||||
#define NARG_I(...) ARG_N(__VA_ARGS__)
|
||||
|
||||
/* Define a macro which will call an arbitrary macro appended with a number indicating
|
||||
* the number of arguments it has. */
|
||||
#define VFUNC_N_(name, n) name##n
|
||||
#define VFUNC_N(name, n) VFUNC_N_(name, n)
|
||||
#define VFUNC(func, ...) VFUNC_N(func, NARG(__VA_ARGS__)) (__VA_ARGS__)
|
||||
|
||||
/* Macros to extract the formats and the arguments from the fmt-arg pairs and
|
||||
* then combine them again with all formats first and the arguments last. */
|
||||
#define COMPACT_FMT(...) VFUNC(COMPACT_FMT_, __VA_ARGS__)
|
||||
#define COMPACT_VALUES(...) VFUNC(COMPACT_VALUES_, __VA_ARGS__)
|
||||
#define FMTARGS(...) COMPACT_FMT(__VA_ARGS__), COMPACT_VALUES(__VA_ARGS__)
|
||||
|
||||
/* Everything below this line is automatically generated by
|
||||
* generate-fmtargs.py. Do not manually edit. */
|
||||
|
||||
#define ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, _65, _66, _67, _68, _69, _70, _71, _72, _73, _74, _75, _76, _77, _78, _79, _80, _81, _82, _83, _84, _85, _86, _87, _88, _89, _90, _91, _92, _93, _94, _95, _96, _97, _98, _99, _100, _101, _102, _103, _104, _105, _106, _107, _108, _109, _110, _111, _112, _113, _114, _115, _116, _117, _118, _119, _120, N, ...) N
|
||||
|
||||
#define RSEQ_N() 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
|
||||
|
||||
#define COMPACT_FMT_2(fmt, value) fmt
|
||||
#define COMPACT_FMT_4(fmt, value, ...) fmt COMPACT_FMT_2(__VA_ARGS__)
|
||||
#define COMPACT_FMT_6(fmt, value, ...) fmt COMPACT_FMT_4(__VA_ARGS__)
|
||||
#define COMPACT_FMT_8(fmt, value, ...) fmt COMPACT_FMT_6(__VA_ARGS__)
|
||||
#define COMPACT_FMT_10(fmt, value, ...) fmt COMPACT_FMT_8(__VA_ARGS__)
|
||||
#define COMPACT_FMT_12(fmt, value, ...) fmt COMPACT_FMT_10(__VA_ARGS__)
|
||||
#define COMPACT_FMT_14(fmt, value, ...) fmt COMPACT_FMT_12(__VA_ARGS__)
|
||||
#define COMPACT_FMT_16(fmt, value, ...) fmt COMPACT_FMT_14(__VA_ARGS__)
|
||||
#define COMPACT_FMT_18(fmt, value, ...) fmt COMPACT_FMT_16(__VA_ARGS__)
|
||||
#define COMPACT_FMT_20(fmt, value, ...) fmt COMPACT_FMT_18(__VA_ARGS__)
|
||||
#define COMPACT_FMT_22(fmt, value, ...) fmt COMPACT_FMT_20(__VA_ARGS__)
|
||||
#define COMPACT_FMT_24(fmt, value, ...) fmt COMPACT_FMT_22(__VA_ARGS__)
|
||||
#define COMPACT_FMT_26(fmt, value, ...) fmt COMPACT_FMT_24(__VA_ARGS__)
|
||||
#define COMPACT_FMT_28(fmt, value, ...) fmt COMPACT_FMT_26(__VA_ARGS__)
|
||||
#define COMPACT_FMT_30(fmt, value, ...) fmt COMPACT_FMT_28(__VA_ARGS__)
|
||||
#define COMPACT_FMT_32(fmt, value, ...) fmt COMPACT_FMT_30(__VA_ARGS__)
|
||||
#define COMPACT_FMT_34(fmt, value, ...) fmt COMPACT_FMT_32(__VA_ARGS__)
|
||||
#define COMPACT_FMT_36(fmt, value, ...) fmt COMPACT_FMT_34(__VA_ARGS__)
|
||||
#define COMPACT_FMT_38(fmt, value, ...) fmt COMPACT_FMT_36(__VA_ARGS__)
|
||||
#define COMPACT_FMT_40(fmt, value, ...) fmt COMPACT_FMT_38(__VA_ARGS__)
|
||||
#define COMPACT_FMT_42(fmt, value, ...) fmt COMPACT_FMT_40(__VA_ARGS__)
|
||||
#define COMPACT_FMT_44(fmt, value, ...) fmt COMPACT_FMT_42(__VA_ARGS__)
|
||||
#define COMPACT_FMT_46(fmt, value, ...) fmt COMPACT_FMT_44(__VA_ARGS__)
|
||||
#define COMPACT_FMT_48(fmt, value, ...) fmt COMPACT_FMT_46(__VA_ARGS__)
|
||||
#define COMPACT_FMT_50(fmt, value, ...) fmt COMPACT_FMT_48(__VA_ARGS__)
|
||||
#define COMPACT_FMT_52(fmt, value, ...) fmt COMPACT_FMT_50(__VA_ARGS__)
|
||||
#define COMPACT_FMT_54(fmt, value, ...) fmt COMPACT_FMT_52(__VA_ARGS__)
|
||||
#define COMPACT_FMT_56(fmt, value, ...) fmt COMPACT_FMT_54(__VA_ARGS__)
|
||||
#define COMPACT_FMT_58(fmt, value, ...) fmt COMPACT_FMT_56(__VA_ARGS__)
|
||||
#define COMPACT_FMT_60(fmt, value, ...) fmt COMPACT_FMT_58(__VA_ARGS__)
|
||||
#define COMPACT_FMT_62(fmt, value, ...) fmt COMPACT_FMT_60(__VA_ARGS__)
|
||||
#define COMPACT_FMT_64(fmt, value, ...) fmt COMPACT_FMT_62(__VA_ARGS__)
|
||||
#define COMPACT_FMT_66(fmt, value, ...) fmt COMPACT_FMT_64(__VA_ARGS__)
|
||||
#define COMPACT_FMT_68(fmt, value, ...) fmt COMPACT_FMT_66(__VA_ARGS__)
|
||||
#define COMPACT_FMT_70(fmt, value, ...) fmt COMPACT_FMT_68(__VA_ARGS__)
|
||||
#define COMPACT_FMT_72(fmt, value, ...) fmt COMPACT_FMT_70(__VA_ARGS__)
|
||||
#define COMPACT_FMT_74(fmt, value, ...) fmt COMPACT_FMT_72(__VA_ARGS__)
|
||||
#define COMPACT_FMT_76(fmt, value, ...) fmt COMPACT_FMT_74(__VA_ARGS__)
|
||||
#define COMPACT_FMT_78(fmt, value, ...) fmt COMPACT_FMT_76(__VA_ARGS__)
|
||||
#define COMPACT_FMT_80(fmt, value, ...) fmt COMPACT_FMT_78(__VA_ARGS__)
|
||||
#define COMPACT_FMT_82(fmt, value, ...) fmt COMPACT_FMT_80(__VA_ARGS__)
|
||||
#define COMPACT_FMT_84(fmt, value, ...) fmt COMPACT_FMT_82(__VA_ARGS__)
|
||||
#define COMPACT_FMT_86(fmt, value, ...) fmt COMPACT_FMT_84(__VA_ARGS__)
|
||||
#define COMPACT_FMT_88(fmt, value, ...) fmt COMPACT_FMT_86(__VA_ARGS__)
|
||||
#define COMPACT_FMT_90(fmt, value, ...) fmt COMPACT_FMT_88(__VA_ARGS__)
|
||||
#define COMPACT_FMT_92(fmt, value, ...) fmt COMPACT_FMT_90(__VA_ARGS__)
|
||||
#define COMPACT_FMT_94(fmt, value, ...) fmt COMPACT_FMT_92(__VA_ARGS__)
|
||||
#define COMPACT_FMT_96(fmt, value, ...) fmt COMPACT_FMT_94(__VA_ARGS__)
|
||||
#define COMPACT_FMT_98(fmt, value, ...) fmt COMPACT_FMT_96(__VA_ARGS__)
|
||||
#define COMPACT_FMT_100(fmt, value, ...) fmt COMPACT_FMT_98(__VA_ARGS__)
|
||||
#define COMPACT_FMT_102(fmt, value, ...) fmt COMPACT_FMT_100(__VA_ARGS__)
|
||||
#define COMPACT_FMT_104(fmt, value, ...) fmt COMPACT_FMT_102(__VA_ARGS__)
|
||||
#define COMPACT_FMT_106(fmt, value, ...) fmt COMPACT_FMT_104(__VA_ARGS__)
|
||||
#define COMPACT_FMT_108(fmt, value, ...) fmt COMPACT_FMT_106(__VA_ARGS__)
|
||||
#define COMPACT_FMT_110(fmt, value, ...) fmt COMPACT_FMT_108(__VA_ARGS__)
|
||||
#define COMPACT_FMT_112(fmt, value, ...) fmt COMPACT_FMT_110(__VA_ARGS__)
|
||||
#define COMPACT_FMT_114(fmt, value, ...) fmt COMPACT_FMT_112(__VA_ARGS__)
|
||||
#define COMPACT_FMT_116(fmt, value, ...) fmt COMPACT_FMT_114(__VA_ARGS__)
|
||||
#define COMPACT_FMT_118(fmt, value, ...) fmt COMPACT_FMT_116(__VA_ARGS__)
|
||||
#define COMPACT_FMT_120(fmt, value, ...) fmt COMPACT_FMT_118(__VA_ARGS__)
|
||||
|
||||
#define COMPACT_VALUES_2(fmt, value) value
|
||||
#define COMPACT_VALUES_4(fmt, value, ...) value, COMPACT_VALUES_2(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_6(fmt, value, ...) value, COMPACT_VALUES_4(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_8(fmt, value, ...) value, COMPACT_VALUES_6(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_10(fmt, value, ...) value, COMPACT_VALUES_8(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_12(fmt, value, ...) value, COMPACT_VALUES_10(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_14(fmt, value, ...) value, COMPACT_VALUES_12(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_16(fmt, value, ...) value, COMPACT_VALUES_14(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_18(fmt, value, ...) value, COMPACT_VALUES_16(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_20(fmt, value, ...) value, COMPACT_VALUES_18(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_22(fmt, value, ...) value, COMPACT_VALUES_20(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_24(fmt, value, ...) value, COMPACT_VALUES_22(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_26(fmt, value, ...) value, COMPACT_VALUES_24(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_28(fmt, value, ...) value, COMPACT_VALUES_26(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_30(fmt, value, ...) value, COMPACT_VALUES_28(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_32(fmt, value, ...) value, COMPACT_VALUES_30(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_34(fmt, value, ...) value, COMPACT_VALUES_32(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_36(fmt, value, ...) value, COMPACT_VALUES_34(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_38(fmt, value, ...) value, COMPACT_VALUES_36(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_40(fmt, value, ...) value, COMPACT_VALUES_38(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_42(fmt, value, ...) value, COMPACT_VALUES_40(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_44(fmt, value, ...) value, COMPACT_VALUES_42(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_46(fmt, value, ...) value, COMPACT_VALUES_44(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_48(fmt, value, ...) value, COMPACT_VALUES_46(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_50(fmt, value, ...) value, COMPACT_VALUES_48(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_52(fmt, value, ...) value, COMPACT_VALUES_50(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_54(fmt, value, ...) value, COMPACT_VALUES_52(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_56(fmt, value, ...) value, COMPACT_VALUES_54(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_58(fmt, value, ...) value, COMPACT_VALUES_56(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_60(fmt, value, ...) value, COMPACT_VALUES_58(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_62(fmt, value, ...) value, COMPACT_VALUES_60(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_64(fmt, value, ...) value, COMPACT_VALUES_62(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_66(fmt, value, ...) value, COMPACT_VALUES_64(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_68(fmt, value, ...) value, COMPACT_VALUES_66(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_70(fmt, value, ...) value, COMPACT_VALUES_68(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_72(fmt, value, ...) value, COMPACT_VALUES_70(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_74(fmt, value, ...) value, COMPACT_VALUES_72(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_76(fmt, value, ...) value, COMPACT_VALUES_74(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_78(fmt, value, ...) value, COMPACT_VALUES_76(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_80(fmt, value, ...) value, COMPACT_VALUES_78(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_82(fmt, value, ...) value, COMPACT_VALUES_80(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_84(fmt, value, ...) value, COMPACT_VALUES_82(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_86(fmt, value, ...) value, COMPACT_VALUES_84(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_88(fmt, value, ...) value, COMPACT_VALUES_86(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_90(fmt, value, ...) value, COMPACT_VALUES_88(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_92(fmt, value, ...) value, COMPACT_VALUES_90(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_94(fmt, value, ...) value, COMPACT_VALUES_92(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_96(fmt, value, ...) value, COMPACT_VALUES_94(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_98(fmt, value, ...) value, COMPACT_VALUES_96(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_100(fmt, value, ...) value, COMPACT_VALUES_98(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_102(fmt, value, ...) value, COMPACT_VALUES_100(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_104(fmt, value, ...) value, COMPACT_VALUES_102(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_106(fmt, value, ...) value, COMPACT_VALUES_104(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_108(fmt, value, ...) value, COMPACT_VALUES_106(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_110(fmt, value, ...) value, COMPACT_VALUES_108(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_112(fmt, value, ...) value, COMPACT_VALUES_110(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_114(fmt, value, ...) value, COMPACT_VALUES_112(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_116(fmt, value, ...) value, COMPACT_VALUES_114(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_118(fmt, value, ...) value, COMPACT_VALUES_116(__VA_ARGS__)
|
||||
#define COMPACT_VALUES_120(fmt, value, ...) value, COMPACT_VALUES_118(__VA_ARGS__)
|
||||
|
||||
#endif
|
@ -32,6 +32,7 @@
|
||||
#include "cluster.h"
|
||||
#include "script.h"
|
||||
#include "fpconv_dtoa.h"
|
||||
#include "fmtargs.h"
|
||||
#include <sys/socket.h>
|
||||
#include <sys/uio.h>
|
||||
#include <math.h>
|
||||
@ -2815,39 +2816,37 @@ sds catClientInfoString(sds s, client *client) {
|
||||
used_blocks_of_repl_buf = last->id - cur->id + 1;
|
||||
}
|
||||
|
||||
sds ret = sdscatfmt(s,
|
||||
"id=%U addr=%s laddr=%s %s name=%s age=%I idle=%I flags=%s db=%i sub=%i psub=%i ssub=%i multi=%i qbuf=%U qbuf-free=%U argv-mem=%U multi-mem=%U rbs=%U rbp=%U obl=%U oll=%U omem=%U tot-mem=%U events=%s cmd=%s user=%s redir=%I resp=%i lib-name=%s lib-ver=%s",
|
||||
(unsigned long long) client->id,
|
||||
getClientPeerId(client),
|
||||
getClientSockname(client),
|
||||
connGetInfo(client->conn, conninfo, sizeof(conninfo)),
|
||||
client->name ? (char*)client->name->ptr : "",
|
||||
(long long)(server.unixtime - client->ctime),
|
||||
(long long)(server.unixtime - client->lastinteraction),
|
||||
flags,
|
||||
client->db->id,
|
||||
(int) dictSize(client->pubsub_channels),
|
||||
(int) dictSize(client->pubsub_patterns),
|
||||
(int) dictSize(client->pubsubshard_channels),
|
||||
(client->flags & CLIENT_MULTI) ? client->mstate.count : -1,
|
||||
(unsigned long long) sdslen(client->querybuf),
|
||||
(unsigned long long) sdsavail(client->querybuf),
|
||||
(unsigned long long) client->argv_len_sum,
|
||||
(unsigned long long) client->mstate.argv_len_sums,
|
||||
(unsigned long long) client->buf_usable_size,
|
||||
(unsigned long long) client->buf_peak,
|
||||
(unsigned long long) client->bufpos,
|
||||
(unsigned long long) listLength(client->reply) + used_blocks_of_repl_buf,
|
||||
(unsigned long long) obufmem, /* should not include client->buf since we want to see 0 for static clients. */
|
||||
(unsigned long long) total_mem,
|
||||
events,
|
||||
client->lastcmd ? client->lastcmd->fullname : "NULL",
|
||||
client->user ? client->user->name : "(superuser)",
|
||||
(client->flags & CLIENT_TRACKING) ? (long long) client->client_tracking_redirection : -1,
|
||||
client->resp,
|
||||
client->lib_name ? (char*)client->lib_name->ptr : "",
|
||||
client->lib_ver ? (char*)client->lib_ver->ptr : ""
|
||||
);
|
||||
sds ret = sdscatfmt(s, FMTARGS(
|
||||
"id=%U", (unsigned long long) client->id,
|
||||
" addr=%s", getClientPeerId(client),
|
||||
" laddr=%s", getClientSockname(client),
|
||||
" %s", connGetInfo(client->conn, conninfo, sizeof(conninfo)),
|
||||
" name=%s", client->name ? (char*)client->name->ptr : "",
|
||||
" age=%I", (long long)(server.unixtime - client->ctime),
|
||||
" idle=%I", (long long)(server.unixtime - client->lastinteraction),
|
||||
" flags=%s", flags,
|
||||
" db=%i", client->db->id,
|
||||
" sub=%i", (int) dictSize(client->pubsub_channels),
|
||||
" psub=%i", (int) dictSize(client->pubsub_patterns),
|
||||
" ssub=%i", (int) dictSize(client->pubsubshard_channels),
|
||||
" multi=%i", (client->flags & CLIENT_MULTI) ? client->mstate.count : -1,
|
||||
" qbuf=%U", (unsigned long long) sdslen(client->querybuf),
|
||||
" qbuf-free=%U", (unsigned long long) sdsavail(client->querybuf),
|
||||
" argv-mem=%U", (unsigned long long) client->argv_len_sum,
|
||||
" multi-mem=%U", (unsigned long long) client->mstate.argv_len_sums,
|
||||
" rbs=%U", (unsigned long long) client->buf_usable_size,
|
||||
" rbp=%U", (unsigned long long) client->buf_peak,
|
||||
" obl=%U", (unsigned long long) client->bufpos,
|
||||
" oll=%U", (unsigned long long) listLength(client->reply) + used_blocks_of_repl_buf,
|
||||
" omem=%U", (unsigned long long) obufmem, /* should not include client->buf since we want to see 0 for static clients. */
|
||||
" tot-mem=%U", (unsigned long long) total_mem,
|
||||
" events=%s", events,
|
||||
" cmd=%s", client->lastcmd ? client->lastcmd->fullname : "NULL",
|
||||
" user=%s", client->user ? client->user->name : "(superuser)",
|
||||
" redir=%I", (client->flags & CLIENT_TRACKING) ? (long long) client->client_tracking_redirection : -1,
|
||||
" resp=%i", client->resp,
|
||||
" lib-name=%s", client->lib_name ? (char*)client->lib_name->ptr : "",
|
||||
" lib-ver=%s", client->lib_ver ? (char*)client->lib_ver->ptr : ""));
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
699
src/server.c
699
src/server.c
@ -39,6 +39,7 @@
|
||||
#include "hdr_histogram.h"
|
||||
#include "syscheck.h"
|
||||
#include "threads_mngr.h"
|
||||
#include "fmtargs.h"
|
||||
|
||||
#include <time.h>
|
||||
#include <signal.h>
|
||||
@ -70,6 +71,12 @@
|
||||
#include <sys/sysctl.h>
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define GNUC_VERSION_STR STRINGIFY(__GNUC__) "." STRINGIFY(__GNUC_MINOR__) "." STRINGIFY(__GNUC_PATCHLEVEL__)
|
||||
#else
|
||||
#define GNUC_VERSION_STR "0.0.0"
|
||||
#endif
|
||||
|
||||
/* Our shared "common" objects */
|
||||
|
||||
struct sharedObjectsStruct shared;
|
||||
@ -5490,60 +5497,33 @@ sds genRedisInfoString(dict *section_dict, int all_sections, int everything) {
|
||||
call_uname = 0;
|
||||
}
|
||||
|
||||
info = sdscatfmt(info,
|
||||
"# Server\r\n"
|
||||
"redis_version:%s\r\n"
|
||||
"redis_git_sha1:%s\r\n"
|
||||
"redis_git_dirty:%i\r\n"
|
||||
"redis_build_id:%s\r\n"
|
||||
"redis_mode:%s\r\n"
|
||||
"os:%s %s %s\r\n"
|
||||
"arch_bits:%i\r\n"
|
||||
"monotonic_clock:%s\r\n"
|
||||
"multiplexing_api:%s\r\n"
|
||||
"atomicvar_api:%s\r\n"
|
||||
"gcc_version:%i.%i.%i\r\n"
|
||||
"process_id:%I\r\n"
|
||||
"process_supervised:%s\r\n"
|
||||
"run_id:%s\r\n"
|
||||
"tcp_port:%i\r\n"
|
||||
"server_time_usec:%I\r\n"
|
||||
"uptime_in_seconds:%I\r\n"
|
||||
"uptime_in_days:%I\r\n"
|
||||
"hz:%i\r\n"
|
||||
"configured_hz:%i\r\n"
|
||||
"lru_clock:%u\r\n"
|
||||
"executable:%s\r\n"
|
||||
"config_file:%s\r\n"
|
||||
"io_threads_active:%i\r\n",
|
||||
REDIS_VERSION,
|
||||
redisGitSHA1(),
|
||||
strtol(redisGitDirty(),NULL,10) > 0,
|
||||
redisBuildIdString(),
|
||||
mode,
|
||||
name.sysname, name.release, name.machine,
|
||||
server.arch_bits,
|
||||
monotonicInfoString(),
|
||||
aeGetApiName(),
|
||||
REDIS_ATOMIC_API,
|
||||
#ifdef __GNUC__
|
||||
__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__,
|
||||
#else
|
||||
0,0,0,
|
||||
#endif
|
||||
(int64_t) getpid(),
|
||||
supervised,
|
||||
server.runid,
|
||||
server.port ? server.port : server.tls_port,
|
||||
(int64_t)server.ustime,
|
||||
(int64_t)uptime,
|
||||
(int64_t)(uptime/(3600*24)),
|
||||
server.hz,
|
||||
server.config_hz,
|
||||
server.lruclock,
|
||||
server.executable ? server.executable : "",
|
||||
server.configfile ? server.configfile : "",
|
||||
server.io_threads_active);
|
||||
info = sdscatfmt(info, "# Server\r\n" FMTARGS(
|
||||
"redis_version:%s\r\n", REDIS_VERSION,
|
||||
"redis_git_sha1:%s\r\n", redisGitSHA1(),
|
||||
"redis_git_dirty:%i\r\n", strtol(redisGitDirty(),NULL,10) > 0,
|
||||
"redis_build_id:%s\r\n", redisBuildIdString(),
|
||||
"redis_mode:%s\r\n", mode,
|
||||
"os:%s", name.sysname,
|
||||
" %s", name.release,
|
||||
" %s\r\n", name.machine,
|
||||
"arch_bits:%i\r\n", server.arch_bits,
|
||||
"monotonic_clock:%s\r\n", monotonicInfoString(),
|
||||
"multiplexing_api:%s\r\n", aeGetApiName(),
|
||||
"atomicvar_api:%s\r\n", REDIS_ATOMIC_API,
|
||||
"gcc_version:%s\r\n", GNUC_VERSION_STR,
|
||||
"process_id:%I\r\n", (int64_t) getpid(),
|
||||
"process_supervised:%s\r\n", supervised,
|
||||
"run_id:%s\r\n", server.runid,
|
||||
"tcp_port:%i\r\n", server.port ? server.port : server.tls_port,
|
||||
"server_time_usec:%I\r\n", (int64_t)server.ustime,
|
||||
"uptime_in_seconds:%I\r\n", (int64_t)uptime,
|
||||
"uptime_in_days:%I\r\n", (int64_t)(uptime/(3600*24)),
|
||||
"hz:%i\r\n", server.hz,
|
||||
"configured_hz:%i\r\n", server.config_hz,
|
||||
"lru_clock:%u\r\n", server.lruclock,
|
||||
"executable:%s\r\n", server.executable ? server.executable : "",
|
||||
"config_file:%s\r\n", server.configfile ? server.configfile : "",
|
||||
"io_threads_active:%i\r\n", server.io_threads_active));
|
||||
|
||||
/* Conditional properties */
|
||||
if (isShutdownInitiated()) {
|
||||
@ -5563,27 +5543,17 @@ sds genRedisInfoString(dict *section_dict, int all_sections, int everything) {
|
||||
getExpansiveClientsInfo(&maxin,&maxout);
|
||||
totalNumberOfBlockingKeys(&blocking_keys, &blocking_keys_on_nokey);
|
||||
if (sections++) info = sdscat(info,"\r\n");
|
||||
info = sdscatprintf(info,
|
||||
"# Clients\r\n"
|
||||
"connected_clients:%lu\r\n"
|
||||
"cluster_connections:%lu\r\n"
|
||||
"maxclients:%u\r\n"
|
||||
"client_recent_max_input_buffer:%zu\r\n"
|
||||
"client_recent_max_output_buffer:%zu\r\n"
|
||||
"blocked_clients:%d\r\n"
|
||||
"tracking_clients:%d\r\n"
|
||||
"clients_in_timeout_table:%llu\r\n"
|
||||
"total_blocking_keys:%lu\r\n"
|
||||
"total_blocking_keys_on_nokey:%lu\r\n",
|
||||
listLength(server.clients)-listLength(server.slaves),
|
||||
getClusterConnectionsCount(),
|
||||
server.maxclients,
|
||||
maxin, maxout,
|
||||
server.blocked_clients,
|
||||
server.tracking_clients,
|
||||
(unsigned long long) raxSize(server.clients_timeout_table),
|
||||
blocking_keys,
|
||||
blocking_keys_on_nokey);
|
||||
info = sdscatprintf(info, "# Clients\r\n" FMTARGS(
|
||||
"connected_clients:%lu\r\n", listLength(server.clients) - listLength(server.slaves),
|
||||
"cluster_connections:%lu\r\n", getClusterConnectionsCount(),
|
||||
"maxclients:%u\r\n", server.maxclients,
|
||||
"client_recent_max_input_buffer:%zu\r\n", maxin,
|
||||
"client_recent_max_output_buffer:%zu\r\n", maxout,
|
||||
"blocked_clients:%d\r\n", server.blocked_clients,
|
||||
"tracking_clients:%d\r\n", server.tracking_clients,
|
||||
"clients_in_timeout_table:%llu\r\n", (unsigned long long) raxSize(server.clients_timeout_table),
|
||||
"total_blocking_keys:%lu\r\n", blocking_keys,
|
||||
"total_blocking_keys_on_nokey:%lu\r\n", blocking_keys_on_nokey));
|
||||
}
|
||||
|
||||
/* Memory */
|
||||
@ -5620,114 +5590,62 @@ sds genRedisInfoString(dict *section_dict, int all_sections, int everything) {
|
||||
bytesToHuman(maxmemory_hmem,sizeof(maxmemory_hmem),server.maxmemory);
|
||||
|
||||
if (sections++) info = sdscat(info,"\r\n");
|
||||
info = sdscatprintf(info,
|
||||
"# Memory\r\n"
|
||||
"used_memory:%zu\r\n"
|
||||
"used_memory_human:%s\r\n"
|
||||
"used_memory_rss:%zu\r\n"
|
||||
"used_memory_rss_human:%s\r\n"
|
||||
"used_memory_peak:%zu\r\n"
|
||||
"used_memory_peak_human:%s\r\n"
|
||||
"used_memory_peak_perc:%.2f%%\r\n"
|
||||
"used_memory_overhead:%zu\r\n"
|
||||
"used_memory_startup:%zu\r\n"
|
||||
"used_memory_dataset:%zu\r\n"
|
||||
"used_memory_dataset_perc:%.2f%%\r\n"
|
||||
"allocator_allocated:%zu\r\n"
|
||||
"allocator_active:%zu\r\n"
|
||||
"allocator_resident:%zu\r\n"
|
||||
"total_system_memory:%lu\r\n"
|
||||
"total_system_memory_human:%s\r\n"
|
||||
"used_memory_lua:%lld\r\n" /* deprecated, renamed to used_memory_vm_eval */
|
||||
"used_memory_vm_eval:%lld\r\n"
|
||||
"used_memory_lua_human:%s\r\n" /* deprecated */
|
||||
"used_memory_scripts_eval:%lld\r\n"
|
||||
"number_of_cached_scripts:%lu\r\n"
|
||||
"number_of_functions:%lu\r\n"
|
||||
"number_of_libraries:%lu\r\n"
|
||||
"used_memory_vm_functions:%lld\r\n"
|
||||
"used_memory_vm_total:%lld\r\n"
|
||||
"used_memory_vm_total_human:%s\r\n"
|
||||
"used_memory_functions:%lld\r\n"
|
||||
"used_memory_scripts:%lld\r\n"
|
||||
"used_memory_scripts_human:%s\r\n"
|
||||
"maxmemory:%lld\r\n"
|
||||
"maxmemory_human:%s\r\n"
|
||||
"maxmemory_policy:%s\r\n"
|
||||
"allocator_frag_ratio:%.2f\r\n"
|
||||
"allocator_frag_bytes:%zu\r\n"
|
||||
"allocator_rss_ratio:%.2f\r\n"
|
||||
"allocator_rss_bytes:%zd\r\n"
|
||||
"rss_overhead_ratio:%.2f\r\n"
|
||||
"rss_overhead_bytes:%zd\r\n"
|
||||
"mem_fragmentation_ratio:%.2f\r\n"
|
||||
"mem_fragmentation_bytes:%zd\r\n"
|
||||
"mem_not_counted_for_evict:%zu\r\n"
|
||||
"mem_replication_backlog:%zu\r\n"
|
||||
"mem_total_replication_buffers:%zu\r\n"
|
||||
"mem_clients_slaves:%zu\r\n"
|
||||
"mem_clients_normal:%zu\r\n"
|
||||
"mem_cluster_links:%zu\r\n"
|
||||
"mem_aof_buffer:%zu\r\n"
|
||||
"mem_allocator:%s\r\n"
|
||||
"active_defrag_running:%d\r\n"
|
||||
"lazyfree_pending_objects:%zu\r\n"
|
||||
"lazyfreed_objects:%zu\r\n",
|
||||
zmalloc_used,
|
||||
hmem,
|
||||
server.cron_malloc_stats.process_rss,
|
||||
used_memory_rss_hmem,
|
||||
server.stat_peak_memory,
|
||||
peak_hmem,
|
||||
mh->peak_perc,
|
||||
mh->overhead_total,
|
||||
mh->startup_allocated,
|
||||
mh->dataset,
|
||||
mh->dataset_perc,
|
||||
server.cron_malloc_stats.allocator_allocated,
|
||||
server.cron_malloc_stats.allocator_active,
|
||||
server.cron_malloc_stats.allocator_resident,
|
||||
(unsigned long)total_system_mem,
|
||||
total_system_hmem,
|
||||
memory_lua,
|
||||
memory_lua,
|
||||
used_memory_lua_hmem,
|
||||
(long long) mh->lua_caches,
|
||||
dictSize(evalScriptsDict()),
|
||||
functionsNum(),
|
||||
functionsLibNum(),
|
||||
memory_functions,
|
||||
memory_functions + memory_lua,
|
||||
used_memory_vm_total_hmem,
|
||||
(long long) mh->functions_caches,
|
||||
(long long) mh->lua_caches + (long long) mh->functions_caches,
|
||||
used_memory_scripts_hmem,
|
||||
server.maxmemory,
|
||||
maxmemory_hmem,
|
||||
evict_policy,
|
||||
mh->allocator_frag,
|
||||
mh->allocator_frag_bytes,
|
||||
mh->allocator_rss,
|
||||
mh->allocator_rss_bytes,
|
||||
mh->rss_extra,
|
||||
mh->rss_extra_bytes,
|
||||
mh->total_frag, /* This is the total RSS overhead, including
|
||||
fragmentation, but not just it. This field
|
||||
(and the next one) is named like that just
|
||||
for backward compatibility. */
|
||||
mh->total_frag_bytes,
|
||||
freeMemoryGetNotCountedMemory(),
|
||||
mh->repl_backlog,
|
||||
server.repl_buffer_mem,
|
||||
mh->clients_slaves,
|
||||
mh->clients_normal,
|
||||
mh->cluster_links,
|
||||
mh->aof_buffer,
|
||||
ZMALLOC_LIB,
|
||||
server.active_defrag_running,
|
||||
lazyfreeGetPendingObjectsCount(),
|
||||
lazyfreeGetFreedObjectsCount()
|
||||
);
|
||||
info = sdscatprintf(info, "# Memory\r\n" FMTARGS(
|
||||
"used_memory:%zu\r\n", zmalloc_used,
|
||||
"used_memory_human:%s\r\n", hmem,
|
||||
"used_memory_rss:%zu\r\n", server.cron_malloc_stats.process_rss,
|
||||
"used_memory_rss_human:%s\r\n", used_memory_rss_hmem,
|
||||
"used_memory_peak:%zu\r\n", server.stat_peak_memory,
|
||||
"used_memory_peak_human:%s\r\n", peak_hmem,
|
||||
"used_memory_peak_perc:%.2f%%\r\n", mh->peak_perc,
|
||||
"used_memory_overhead:%zu\r\n", mh->overhead_total,
|
||||
"used_memory_startup:%zu\r\n", mh->startup_allocated,
|
||||
"used_memory_dataset:%zu\r\n", mh->dataset,
|
||||
"used_memory_dataset_perc:%.2f%%\r\n", mh->dataset_perc,
|
||||
"allocator_allocated:%zu\r\n", server.cron_malloc_stats.allocator_allocated,
|
||||
"allocator_active:%zu\r\n", server.cron_malloc_stats.allocator_active,
|
||||
"allocator_resident:%zu\r\n", server.cron_malloc_stats.allocator_resident,
|
||||
"total_system_memory:%lu\r\n", (unsigned long)total_system_mem,
|
||||
"total_system_memory_human:%s\r\n", total_system_hmem,
|
||||
"used_memory_lua:%lld\r\n", memory_lua, /* deprecated, renamed to used_memory_vm_eval */
|
||||
"used_memory_vm_eval:%lld\r\n", memory_lua,
|
||||
"used_memory_lua_human:%s\r\n", used_memory_lua_hmem, /* deprecated */
|
||||
"used_memory_scripts_eval:%lld\r\n", (long long)mh->lua_caches,
|
||||
"number_of_cached_scripts:%lu\r\n", dictSize(evalScriptsDict()),
|
||||
"number_of_functions:%lu\r\n", functionsNum(),
|
||||
"number_of_libraries:%lu\r\n", functionsLibNum(),
|
||||
"used_memory_vm_functions:%lld\r\n", memory_functions,
|
||||
"used_memory_vm_total:%lld\r\n", memory_functions + memory_lua,
|
||||
"used_memory_vm_total_human:%s\r\n", used_memory_vm_total_hmem,
|
||||
"used_memory_functions:%lld\r\n", (long long)mh->functions_caches,
|
||||
"used_memory_scripts:%lld\r\n", (long long)mh->lua_caches + (long long)mh->functions_caches,
|
||||
"used_memory_scripts_human:%s\r\n", used_memory_scripts_hmem,
|
||||
"maxmemory:%lld\r\n", server.maxmemory,
|
||||
"maxmemory_human:%s\r\n", maxmemory_hmem,
|
||||
"maxmemory_policy:%s\r\n", evict_policy,
|
||||
"allocator_frag_ratio:%.2f\r\n", mh->allocator_frag,
|
||||
"allocator_frag_bytes:%zu\r\n", mh->allocator_frag_bytes,
|
||||
"allocator_rss_ratio:%.2f\r\n", mh->allocator_rss,
|
||||
"allocator_rss_bytes:%zd\r\n", mh->allocator_rss_bytes,
|
||||
"rss_overhead_ratio:%.2f\r\n", mh->rss_extra,
|
||||
"rss_overhead_bytes:%zd\r\n", mh->rss_extra_bytes,
|
||||
/* The next field (mem_fragmentation_ratio) is the total RSS
|
||||
* overhead, including fragmentation, but not just it. This field
|
||||
* (and the next one) is named like that just for backward
|
||||
* compatibility. */
|
||||
"mem_fragmentation_ratio:%.2f\r\n", mh->total_frag,
|
||||
"mem_fragmentation_bytes:%zd\r\n", mh->total_frag_bytes,
|
||||
"mem_not_counted_for_evict:%zu\r\n", freeMemoryGetNotCountedMemory(),
|
||||
"mem_replication_backlog:%zu\r\n", mh->repl_backlog,
|
||||
"mem_total_replication_buffers:%zu\r\n", server.repl_buffer_mem,
|
||||
"mem_clients_slaves:%zu\r\n", mh->clients_slaves,
|
||||
"mem_clients_normal:%zu\r\n", mh->clients_normal,
|
||||
"mem_cluster_links:%zu\r\n", mh->cluster_links,
|
||||
"mem_aof_buffer:%zu\r\n", mh->aof_buffer,
|
||||
"mem_allocator:%s\r\n", ZMALLOC_LIB,
|
||||
"active_defrag_running:%d\r\n", server.active_defrag_running,
|
||||
"lazyfree_pending_objects:%zu\r\n", lazyfreeGetPendingObjectsCount(),
|
||||
"lazyfreed_objects:%zu\r\n", lazyfreeGetFreedObjectsCount()));
|
||||
freeMemoryOverheadData(mh);
|
||||
}
|
||||
|
||||
@ -5743,86 +5661,51 @@ sds genRedisInfoString(dict *section_dict, int all_sections, int everything) {
|
||||
int aof_bio_fsync_status;
|
||||
atomicGet(server.aof_bio_fsync_status,aof_bio_fsync_status);
|
||||
|
||||
info = sdscatprintf(info,
|
||||
"# Persistence\r\n"
|
||||
"loading:%d\r\n"
|
||||
"async_loading:%d\r\n"
|
||||
"current_cow_peak:%zu\r\n"
|
||||
"current_cow_size:%zu\r\n"
|
||||
"current_cow_size_age:%lu\r\n"
|
||||
"current_fork_perc:%.2f\r\n"
|
||||
"current_save_keys_processed:%zu\r\n"
|
||||
"current_save_keys_total:%zu\r\n"
|
||||
"rdb_changes_since_last_save:%lld\r\n"
|
||||
"rdb_bgsave_in_progress:%d\r\n"
|
||||
"rdb_last_save_time:%jd\r\n"
|
||||
"rdb_last_bgsave_status:%s\r\n"
|
||||
"rdb_last_bgsave_time_sec:%jd\r\n"
|
||||
"rdb_current_bgsave_time_sec:%jd\r\n"
|
||||
"rdb_saves:%lld\r\n"
|
||||
"rdb_last_cow_size:%zu\r\n"
|
||||
"rdb_last_load_keys_expired:%lld\r\n"
|
||||
"rdb_last_load_keys_loaded:%lld\r\n"
|
||||
"aof_enabled:%d\r\n"
|
||||
"aof_rewrite_in_progress:%d\r\n"
|
||||
"aof_rewrite_scheduled:%d\r\n"
|
||||
"aof_last_rewrite_time_sec:%jd\r\n"
|
||||
"aof_current_rewrite_time_sec:%jd\r\n"
|
||||
"aof_last_bgrewrite_status:%s\r\n"
|
||||
"aof_rewrites:%lld\r\n"
|
||||
"aof_rewrites_consecutive_failures:%lld\r\n"
|
||||
"aof_last_write_status:%s\r\n"
|
||||
"aof_last_cow_size:%zu\r\n"
|
||||
"module_fork_in_progress:%d\r\n"
|
||||
"module_fork_last_cow_size:%zu\r\n",
|
||||
(int)(server.loading && !server.async_loading),
|
||||
(int)server.async_loading,
|
||||
server.stat_current_cow_peak,
|
||||
server.stat_current_cow_bytes,
|
||||
server.stat_current_cow_updated ? (unsigned long) elapsedMs(server.stat_current_cow_updated) / 1000 : 0,
|
||||
fork_perc,
|
||||
server.stat_current_save_keys_processed,
|
||||
server.stat_current_save_keys_total,
|
||||
server.dirty,
|
||||
server.child_type == CHILD_TYPE_RDB,
|
||||
(intmax_t)server.lastsave,
|
||||
(server.lastbgsave_status == C_OK) ? "ok" : "err",
|
||||
(intmax_t)server.rdb_save_time_last,
|
||||
(intmax_t)((server.child_type != CHILD_TYPE_RDB) ?
|
||||
-1 : time(NULL)-server.rdb_save_time_start),
|
||||
server.stat_rdb_saves,
|
||||
server.stat_rdb_cow_bytes,
|
||||
server.rdb_last_load_keys_expired,
|
||||
server.rdb_last_load_keys_loaded,
|
||||
server.aof_state != AOF_OFF,
|
||||
server.child_type == CHILD_TYPE_AOF,
|
||||
server.aof_rewrite_scheduled,
|
||||
(intmax_t)server.aof_rewrite_time_last,
|
||||
(intmax_t)((server.child_type != CHILD_TYPE_AOF) ?
|
||||
-1 : time(NULL)-server.aof_rewrite_time_start),
|
||||
(server.aof_lastbgrewrite_status == C_OK) ? "ok" : "err",
|
||||
server.stat_aof_rewrites,
|
||||
server.stat_aofrw_consecutive_failures,
|
||||
(server.aof_last_write_status == C_OK &&
|
||||
aof_bio_fsync_status == C_OK) ? "ok" : "err",
|
||||
server.stat_aof_cow_bytes,
|
||||
server.child_type == CHILD_TYPE_MODULE,
|
||||
server.stat_module_cow_bytes);
|
||||
info = sdscatprintf(info, "# Persistence\r\n" FMTARGS(
|
||||
"loading:%d\r\n", (int)(server.loading && !server.async_loading),
|
||||
"async_loading:%d\r\n", (int)server.async_loading,
|
||||
"current_cow_peak:%zu\r\n", server.stat_current_cow_peak,
|
||||
"current_cow_size:%zu\r\n", server.stat_current_cow_bytes,
|
||||
"current_cow_size_age:%lu\r\n", (server.stat_current_cow_updated ?
|
||||
(unsigned long) elapsedMs(server.stat_current_cow_updated) / 1000 : 0),
|
||||
"current_fork_perc:%.2f\r\n", fork_perc,
|
||||
"current_save_keys_processed:%zu\r\n", server.stat_current_save_keys_processed,
|
||||
"current_save_keys_total:%zu\r\n", server.stat_current_save_keys_total,
|
||||
"rdb_changes_since_last_save:%lld\r\n", server.dirty,
|
||||
"rdb_bgsave_in_progress:%d\r\n", server.child_type == CHILD_TYPE_RDB,
|
||||
"rdb_last_save_time:%jd\r\n", (intmax_t)server.lastsave,
|
||||
"rdb_last_bgsave_status:%s\r\n", (server.lastbgsave_status == C_OK) ? "ok" : "err",
|
||||
"rdb_last_bgsave_time_sec:%jd\r\n", (intmax_t)server.rdb_save_time_last,
|
||||
"rdb_current_bgsave_time_sec:%jd\r\n", (intmax_t)((server.child_type != CHILD_TYPE_RDB) ?
|
||||
-1 : time(NULL)-server.rdb_save_time_start),
|
||||
"rdb_saves:%lld\r\n", server.stat_rdb_saves,
|
||||
"rdb_last_cow_size:%zu\r\n", server.stat_rdb_cow_bytes,
|
||||
"rdb_last_load_keys_expired:%lld\r\n", server.rdb_last_load_keys_expired,
|
||||
"rdb_last_load_keys_loaded:%lld\r\n", server.rdb_last_load_keys_loaded,
|
||||
"aof_enabled:%d\r\n", server.aof_state != AOF_OFF,
|
||||
"aof_rewrite_in_progress:%d\r\n", server.child_type == CHILD_TYPE_AOF,
|
||||
"aof_rewrite_scheduled:%d\r\n", server.aof_rewrite_scheduled,
|
||||
"aof_last_rewrite_time_sec:%jd\r\n", (intmax_t)server.aof_rewrite_time_last,
|
||||
"aof_current_rewrite_time_sec:%jd\r\n", (intmax_t)((server.child_type != CHILD_TYPE_AOF) ?
|
||||
-1 : time(NULL)-server.aof_rewrite_time_start),
|
||||
"aof_last_bgrewrite_status:%s\r\n", (server.aof_lastbgrewrite_status == C_OK ?
|
||||
"ok" : "err"),
|
||||
"aof_rewrites:%lld\r\n", server.stat_aof_rewrites,
|
||||
"aof_rewrites_consecutive_failures:%lld\r\n", server.stat_aofrw_consecutive_failures,
|
||||
"aof_last_write_status:%s\r\n", (server.aof_last_write_status == C_OK &&
|
||||
aof_bio_fsync_status == C_OK) ? "ok" : "err",
|
||||
"aof_last_cow_size:%zu\r\n", server.stat_aof_cow_bytes,
|
||||
"module_fork_in_progress:%d\r\n", server.child_type == CHILD_TYPE_MODULE,
|
||||
"module_fork_last_cow_size:%zu\r\n", server.stat_module_cow_bytes));
|
||||
|
||||
if (server.aof_enabled) {
|
||||
info = sdscatprintf(info,
|
||||
"aof_current_size:%lld\r\n"
|
||||
"aof_base_size:%lld\r\n"
|
||||
"aof_pending_rewrite:%d\r\n"
|
||||
"aof_buffer_length:%zu\r\n"
|
||||
"aof_pending_bio_fsync:%lu\r\n"
|
||||
"aof_delayed_fsync:%lu\r\n",
|
||||
(long long) server.aof_current_size,
|
||||
(long long) server.aof_rewrite_base_size,
|
||||
server.aof_rewrite_scheduled,
|
||||
sdslen(server.aof_buf),
|
||||
bioPendingJobsOfType(BIO_AOF_FSYNC),
|
||||
server.aof_delayed_fsync);
|
||||
info = sdscatprintf(info, FMTARGS(
|
||||
"aof_current_size:%lld\r\n", (long long) server.aof_current_size,
|
||||
"aof_base_size:%lld\r\n", (long long) server.aof_rewrite_base_size,
|
||||
"aof_pending_rewrite:%d\r\n", server.aof_rewrite_scheduled,
|
||||
"aof_buffer_length:%zu\r\n", sdslen(server.aof_buf),
|
||||
"aof_pending_bio_fsync:%lu\r\n", bioPendingJobsOfType(BIO_AOF_FSYNC),
|
||||
"aof_delayed_fsync:%lu\r\n", server.aof_delayed_fsync));
|
||||
}
|
||||
|
||||
if (server.loading) {
|
||||
@ -5849,20 +5732,13 @@ sds genRedisInfoString(dict *section_dict, int all_sections, int everything) {
|
||||
eta = (elapsed*remaining_bytes)/(server.loading_loaded_bytes+1);
|
||||
}
|
||||
|
||||
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
|
||||
);
|
||||
info = sdscatprintf(info, FMTARGS(
|
||||
"loading_start_time:%jd\r\n", (intmax_t) server.loading_start_time,
|
||||
"loading_total_bytes:%llu\r\n", (unsigned long long) server.loading_total_bytes,
|
||||
"loading_rdb_used_mem:%llu\r\n", (unsigned long long) server.loading_rdb_used_mem,
|
||||
"loading_loaded_bytes:%llu\r\n", (unsigned long long) server.loading_loaded_bytes,
|
||||
"loading_loaded_perc:%.2f\r\n", perc,
|
||||
"loading_eta_seconds:%jd\r\n", (intmax_t)eta));
|
||||
}
|
||||
}
|
||||
|
||||
@ -5883,122 +5759,64 @@ sds genRedisInfoString(dict *section_dict, int all_sections, int everything) {
|
||||
atomicGet(server.stat_net_repl_output_bytes, stat_net_repl_output_bytes);
|
||||
|
||||
if (sections++) info = sdscat(info,"\r\n");
|
||||
info = sdscatprintf(info,
|
||||
"# Stats\r\n"
|
||||
"total_connections_received:%lld\r\n"
|
||||
"total_commands_processed:%lld\r\n"
|
||||
"instantaneous_ops_per_sec:%lld\r\n"
|
||||
"total_net_input_bytes:%lld\r\n"
|
||||
"total_net_output_bytes:%lld\r\n"
|
||||
"total_net_repl_input_bytes:%lld\r\n"
|
||||
"total_net_repl_output_bytes:%lld\r\n"
|
||||
"instantaneous_input_kbps:%.2f\r\n"
|
||||
"instantaneous_output_kbps:%.2f\r\n"
|
||||
"instantaneous_input_repl_kbps:%.2f\r\n"
|
||||
"instantaneous_output_repl_kbps:%.2f\r\n"
|
||||
"rejected_connections:%lld\r\n"
|
||||
"sync_full:%lld\r\n"
|
||||
"sync_partial_ok:%lld\r\n"
|
||||
"sync_partial_err:%lld\r\n"
|
||||
"expired_keys:%lld\r\n"
|
||||
"expired_stale_perc:%.2f\r\n"
|
||||
"expired_time_cap_reached_count:%lld\r\n"
|
||||
"expire_cycle_cpu_milliseconds:%lld\r\n"
|
||||
"evicted_keys:%lld\r\n"
|
||||
"evicted_clients:%lld\r\n"
|
||||
"total_eviction_exceeded_time:%lld\r\n"
|
||||
"current_eviction_exceeded_time:%lld\r\n"
|
||||
"keyspace_hits:%lld\r\n"
|
||||
"keyspace_misses:%lld\r\n"
|
||||
"pubsub_channels:%ld\r\n"
|
||||
"pubsub_patterns:%lu\r\n"
|
||||
"pubsubshard_channels:%lu\r\n"
|
||||
"latest_fork_usec:%lld\r\n"
|
||||
"total_forks:%lld\r\n"
|
||||
"migrate_cached_sockets:%ld\r\n"
|
||||
"slave_expires_tracked_keys:%zu\r\n"
|
||||
"active_defrag_hits:%lld\r\n"
|
||||
"active_defrag_misses:%lld\r\n"
|
||||
"active_defrag_key_hits:%lld\r\n"
|
||||
"active_defrag_key_misses:%lld\r\n"
|
||||
"total_active_defrag_time:%lld\r\n"
|
||||
"current_active_defrag_time:%lld\r\n"
|
||||
"tracking_total_keys:%lld\r\n"
|
||||
"tracking_total_items:%lld\r\n"
|
||||
"tracking_total_prefixes:%lld\r\n"
|
||||
"unexpected_error_replies:%lld\r\n"
|
||||
"total_error_replies:%lld\r\n"
|
||||
"dump_payload_sanitizations:%lld\r\n"
|
||||
"total_reads_processed:%lld\r\n"
|
||||
"total_writes_processed:%lld\r\n"
|
||||
"io_threaded_reads_processed:%lld\r\n"
|
||||
"io_threaded_writes_processed:%lld\r\n"
|
||||
"client_query_buffer_limit_disconnections:%lld\r\n"
|
||||
"client_output_buffer_limit_disconnections:%lld\r\n"
|
||||
"reply_buffer_shrinks:%lld\r\n"
|
||||
"reply_buffer_expands:%lld\r\n"
|
||||
"eventloop_cycles:%llu\r\n"
|
||||
"eventloop_duration_sum:%llu\r\n"
|
||||
"eventloop_duration_cmd_sum:%llu\r\n"
|
||||
"instantaneous_eventloop_cycles_per_sec:%llu\r\n"
|
||||
"instantaneous_eventloop_duration_usec:%llu\r\n",
|
||||
server.stat_numconnections,
|
||||
server.stat_numcommands,
|
||||
getInstantaneousMetric(STATS_METRIC_COMMAND),
|
||||
stat_net_input_bytes + stat_net_repl_input_bytes,
|
||||
stat_net_output_bytes + stat_net_repl_output_bytes,
|
||||
stat_net_repl_input_bytes,
|
||||
stat_net_repl_output_bytes,
|
||||
(float)getInstantaneousMetric(STATS_METRIC_NET_INPUT)/1024,
|
||||
(float)getInstantaneousMetric(STATS_METRIC_NET_OUTPUT)/1024,
|
||||
(float)getInstantaneousMetric(STATS_METRIC_NET_INPUT_REPLICATION)/1024,
|
||||
(float)getInstantaneousMetric(STATS_METRIC_NET_OUTPUT_REPLICATION)/1024,
|
||||
server.stat_rejected_conn,
|
||||
server.stat_sync_full,
|
||||
server.stat_sync_partial_ok,
|
||||
server.stat_sync_partial_err,
|
||||
server.stat_expiredkeys,
|
||||
server.stat_expired_stale_perc*100,
|
||||
server.stat_expired_time_cap_reached_count,
|
||||
server.stat_expire_cycle_time_used/1000,
|
||||
server.stat_evictedkeys,
|
||||
server.stat_evictedclients,
|
||||
(server.stat_total_eviction_exceeded_time + current_eviction_exceeded_time) / 1000,
|
||||
current_eviction_exceeded_time / 1000,
|
||||
server.stat_keyspace_hits,
|
||||
server.stat_keyspace_misses,
|
||||
dictSize(server.pubsub_channels),
|
||||
dictSize(server.pubsub_patterns),
|
||||
dictSize(server.pubsubshard_channels),
|
||||
server.stat_fork_time,
|
||||
server.stat_total_forks,
|
||||
dictSize(server.migrate_cached_sockets),
|
||||
getSlaveKeyWithExpireCount(),
|
||||
server.stat_active_defrag_hits,
|
||||
server.stat_active_defrag_misses,
|
||||
server.stat_active_defrag_key_hits,
|
||||
server.stat_active_defrag_key_misses,
|
||||
(server.stat_total_active_defrag_time + current_active_defrag_time) / 1000,
|
||||
current_active_defrag_time / 1000,
|
||||
(unsigned long long) trackingGetTotalKeys(),
|
||||
(unsigned long long) trackingGetTotalItems(),
|
||||
(unsigned long long) trackingGetTotalPrefixes(),
|
||||
server.stat_unexpected_error_replies,
|
||||
server.stat_total_error_replies,
|
||||
server.stat_dump_payload_sanitizations,
|
||||
stat_total_reads_processed,
|
||||
stat_total_writes_processed,
|
||||
server.stat_io_reads_processed,
|
||||
server.stat_io_writes_processed,
|
||||
server.stat_client_qbuf_limit_disconnections,
|
||||
server.stat_client_outbuf_limit_disconnections,
|
||||
server.stat_reply_buffer_shrinks,
|
||||
server.stat_reply_buffer_expands,
|
||||
server.duration_stats[EL_DURATION_TYPE_EL].cnt,
|
||||
server.duration_stats[EL_DURATION_TYPE_EL].sum,
|
||||
server.duration_stats[EL_DURATION_TYPE_CMD].sum,
|
||||
getInstantaneousMetric(STATS_METRIC_EL_CYCLE),
|
||||
getInstantaneousMetric(STATS_METRIC_EL_DURATION));
|
||||
info = sdscatprintf(info, "# Stats\r\n" FMTARGS(
|
||||
"total_connections_received:%lld\r\n", server.stat_numconnections,
|
||||
"total_commands_processed:%lld\r\n", server.stat_numcommands,
|
||||
"instantaneous_ops_per_sec:%lld\r\n", getInstantaneousMetric(STATS_METRIC_COMMAND),
|
||||
"total_net_input_bytes:%lld\r\n", stat_net_input_bytes + stat_net_repl_input_bytes,
|
||||
"total_net_output_bytes:%lld\r\n", stat_net_output_bytes + stat_net_repl_output_bytes,
|
||||
"total_net_repl_input_bytes:%lld\r\n", stat_net_repl_input_bytes,
|
||||
"total_net_repl_output_bytes:%lld\r\n", stat_net_repl_output_bytes,
|
||||
"instantaneous_input_kbps:%.2f\r\n", (float)getInstantaneousMetric(STATS_METRIC_NET_INPUT)/1024,
|
||||
"instantaneous_output_kbps:%.2f\r\n", (float)getInstantaneousMetric(STATS_METRIC_NET_OUTPUT)/1024,
|
||||
"instantaneous_input_repl_kbps:%.2f\r\n", (float)getInstantaneousMetric(STATS_METRIC_NET_INPUT_REPLICATION)/1024,
|
||||
"instantaneous_output_repl_kbps:%.2f\r\n", (float)getInstantaneousMetric(STATS_METRIC_NET_OUTPUT_REPLICATION)/1024,
|
||||
"rejected_connections:%lld\r\n", server.stat_rejected_conn,
|
||||
"sync_full:%lld\r\n", server.stat_sync_full,
|
||||
"sync_partial_ok:%lld\r\n", server.stat_sync_partial_ok,
|
||||
"sync_partial_err:%lld\r\n", server.stat_sync_partial_err,
|
||||
"expired_keys:%lld\r\n", server.stat_expiredkeys,
|
||||
"expired_stale_perc:%.2f\r\n", server.stat_expired_stale_perc*100,
|
||||
"expired_time_cap_reached_count:%lld\r\n", server.stat_expired_time_cap_reached_count,
|
||||
"expire_cycle_cpu_milliseconds:%lld\r\n", server.stat_expire_cycle_time_used/1000,
|
||||
"evicted_keys:%lld\r\n", server.stat_evictedkeys,
|
||||
"evicted_clients:%lld\r\n", server.stat_evictedclients,
|
||||
"total_eviction_exceeded_time:%lld\r\n", (server.stat_total_eviction_exceeded_time + current_eviction_exceeded_time) / 1000,
|
||||
"current_eviction_exceeded_time:%lld\r\n", current_eviction_exceeded_time / 1000,
|
||||
"keyspace_hits:%lld\r\n", server.stat_keyspace_hits,
|
||||
"keyspace_misses:%lld\r\n", server.stat_keyspace_misses,
|
||||
"pubsub_channels:%ld\r\n", dictSize(server.pubsub_channels),
|
||||
"pubsub_patterns:%lu\r\n", dictSize(server.pubsub_patterns),
|
||||
"pubsubshard_channels:%lu\r\n", dictSize(server.pubsubshard_channels),
|
||||
"latest_fork_usec:%lld\r\n", server.stat_fork_time,
|
||||
"total_forks:%lld\r\n", server.stat_total_forks,
|
||||
"migrate_cached_sockets:%ld\r\n", dictSize(server.migrate_cached_sockets),
|
||||
"slave_expires_tracked_keys:%zu\r\n", getSlaveKeyWithExpireCount(),
|
||||
"active_defrag_hits:%lld\r\n", server.stat_active_defrag_hits,
|
||||
"active_defrag_misses:%lld\r\n", server.stat_active_defrag_misses,
|
||||
"active_defrag_key_hits:%lld\r\n", server.stat_active_defrag_key_hits,
|
||||
"active_defrag_key_misses:%lld\r\n", server.stat_active_defrag_key_misses,
|
||||
"total_active_defrag_time:%lld\r\n", (server.stat_total_active_defrag_time + current_active_defrag_time) / 1000,
|
||||
"current_active_defrag_time:%lld\r\n", current_active_defrag_time / 1000,
|
||||
"tracking_total_keys:%lld\r\n", (unsigned long long) trackingGetTotalKeys(),
|
||||
"tracking_total_items:%lld\r\n", (unsigned long long) trackingGetTotalItems(),
|
||||
"tracking_total_prefixes:%lld\r\n", (unsigned long long) trackingGetTotalPrefixes(),
|
||||
"unexpected_error_replies:%lld\r\n", server.stat_unexpected_error_replies,
|
||||
"total_error_replies:%lld\r\n", server.stat_total_error_replies,
|
||||
"dump_payload_sanitizations:%lld\r\n", server.stat_dump_payload_sanitizations,
|
||||
"total_reads_processed:%lld\r\n", stat_total_reads_processed,
|
||||
"total_writes_processed:%lld\r\n", stat_total_writes_processed,
|
||||
"io_threaded_reads_processed:%lld\r\n", server.stat_io_reads_processed,
|
||||
"io_threaded_writes_processed:%lld\r\n", server.stat_io_writes_processed,
|
||||
"client_query_buffer_limit_disconnections:%lld\r\n", server.stat_client_qbuf_limit_disconnections,
|
||||
"client_output_buffer_limit_disconnections:%lld\r\n", server.stat_client_outbuf_limit_disconnections,
|
||||
"reply_buffer_shrinks:%lld\r\n", server.stat_reply_buffer_shrinks,
|
||||
"reply_buffer_expands:%lld\r\n", server.stat_reply_buffer_expands,
|
||||
"eventloop_cycles:%llu\r\n", server.duration_stats[EL_DURATION_TYPE_EL].cnt,
|
||||
"eventloop_duration_sum:%llu\r\n", server.duration_stats[EL_DURATION_TYPE_EL].sum,
|
||||
"eventloop_duration_cmd_sum:%llu\r\n", server.duration_stats[EL_DURATION_TYPE_CMD].sum,
|
||||
"instantaneous_eventloop_cycles_per_sec:%llu\r\n", getInstantaneousMetric(STATS_METRIC_EL_CYCLE),
|
||||
"instantaneous_eventloop_duration_usec:%llu\r\n", getInstantaneousMetric(STATS_METRIC_EL_DURATION)));
|
||||
info = genRedisInfoStringACLStats(info);
|
||||
}
|
||||
|
||||
@ -6021,42 +5839,26 @@ sds genRedisInfoString(dict *section_dict, int all_sections, int everything) {
|
||||
slave_read_repl_offset = server.cached_master->read_reploff;
|
||||
}
|
||||
|
||||
info = sdscatprintf(info,
|
||||
"master_host:%s\r\n"
|
||||
"master_port:%d\r\n"
|
||||
"master_link_status:%s\r\n"
|
||||
"master_last_io_seconds_ago:%d\r\n"
|
||||
"master_sync_in_progress:%d\r\n"
|
||||
"slave_read_repl_offset:%lld\r\n"
|
||||
"slave_repl_offset:%lld\r\n"
|
||||
,server.masterhost,
|
||||
server.masterport,
|
||||
(server.repl_state == REPL_STATE_CONNECTED) ?
|
||||
"up" : "down",
|
||||
server.master ?
|
||||
((int)(server.unixtime-server.master->lastinteraction)) : -1,
|
||||
server.repl_state == REPL_STATE_TRANSFER,
|
||||
slave_read_repl_offset,
|
||||
slave_repl_offset
|
||||
);
|
||||
info = sdscatprintf(info, FMTARGS(
|
||||
"master_host:%s\r\n", server.masterhost,
|
||||
"master_port:%d\r\n", server.masterport,
|
||||
"master_link_status:%s\r\n", (server.repl_state == REPL_STATE_CONNECTED) ? "up" : "down",
|
||||
"master_last_io_seconds_ago:%d\r\n", server.master ? ((int)(server.unixtime-server.master->lastinteraction)) : -1,
|
||||
"master_sync_in_progress:%d\r\n", server.repl_state == REPL_STATE_TRANSFER,
|
||||
"slave_read_repl_offset:%lld\r\n", slave_read_repl_offset,
|
||||
"slave_repl_offset:%lld\r\n", slave_repl_offset));
|
||||
|
||||
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_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)
|
||||
);
|
||||
info = sdscatprintf(info, FMTARGS(
|
||||
"master_sync_total_bytes:%lld\r\n", (long long) server.repl_transfer_size,
|
||||
"master_sync_read_bytes:%lld\r\n", (long long) server.repl_transfer_read,
|
||||
"master_sync_left_bytes:%lld\r\n", (long long) (server.repl_transfer_size - server.repl_transfer_read),
|
||||
"master_sync_perc:%.2f\r\n", perc,
|
||||
"master_sync_last_io_seconds_ago:%d\r\n", (int)(server.unixtime-server.repl_transfer_lastio)));
|
||||
}
|
||||
|
||||
if (server.repl_state != REPL_STATE_CONNECTED) {
|
||||
@ -6065,13 +5867,10 @@ sds genRedisInfoString(dict *section_dict, int all_sections, int everything) {
|
||||
server.repl_down_since ?
|
||||
(intmax_t)(server.unixtime-server.repl_down_since) : -1);
|
||||
}
|
||||
info = sdscatprintf(info,
|
||||
"slave_priority:%d\r\n"
|
||||
"slave_read_only:%d\r\n"
|
||||
"replica_announced:%d\r\n",
|
||||
server.slave_priority,
|
||||
server.repl_slave_ro,
|
||||
server.replica_announced);
|
||||
info = sdscatprintf(info, FMTARGS(
|
||||
"slave_priority:%d\r\n", server.slave_priority,
|
||||
"slave_read_only:%d\r\n", server.repl_slave_ro,
|
||||
"replica_announced:%d\r\n", server.replica_announced));
|
||||
}
|
||||
|
||||
info = sdscatprintf(info,
|
||||
@ -6117,25 +5916,16 @@ sds genRedisInfoString(dict *section_dict, int all_sections, int everything) {
|
||||
slaveid++;
|
||||
}
|
||||
}
|
||||
info = sdscatprintf(info,
|
||||
"master_failover_state:%s\r\n"
|
||||
"master_replid:%s\r\n"
|
||||
"master_replid2:%s\r\n"
|
||||
"master_repl_offset:%lld\r\n"
|
||||
"second_repl_offset:%lld\r\n"
|
||||
"repl_backlog_active:%d\r\n"
|
||||
"repl_backlog_size:%lld\r\n"
|
||||
"repl_backlog_first_byte_offset:%lld\r\n"
|
||||
"repl_backlog_histlen:%lld\r\n",
|
||||
getFailoverStateString(),
|
||||
server.replid,
|
||||
server.replid2,
|
||||
server.master_repl_offset,
|
||||
server.second_replid_offset,
|
||||
server.repl_backlog != NULL,
|
||||
server.repl_backlog_size,
|
||||
server.repl_backlog ? server.repl_backlog->offset : 0,
|
||||
server.repl_backlog ? server.repl_backlog->histlen : 0);
|
||||
info = sdscatprintf(info, FMTARGS(
|
||||
"master_failover_state:%s\r\n", getFailoverStateString(),
|
||||
"master_replid:%s\r\n", server.replid,
|
||||
"master_replid2:%s\r\n", server.replid2,
|
||||
"master_repl_offset:%lld\r\n", server.master_repl_offset,
|
||||
"second_repl_offset:%lld\r\n", server.second_replid_offset,
|
||||
"repl_backlog_active:%d\r\n", server.repl_backlog != NULL,
|
||||
"repl_backlog_size:%lld\r\n", server.repl_backlog_size,
|
||||
"repl_backlog_first_byte_offset:%lld\r\n", server.repl_backlog ? server.repl_backlog->offset : 0,
|
||||
"repl_backlog_histlen:%lld\r\n", server.repl_backlog ? server.repl_backlog->histlen : 0));
|
||||
}
|
||||
|
||||
/* CPU */
|
||||
@ -6251,16 +6041,11 @@ sds genRedisInfoString(dict *section_dict, int all_sections, int everything) {
|
||||
|
||||
if (dictFind(section_dict, "debug") != NULL) {
|
||||
if (sections++) info = sdscat(info,"\r\n");
|
||||
info = sdscatprintf(info,
|
||||
"# Debug\r\n"
|
||||
"eventloop_duration_aof_sum:%llu\r\n"
|
||||
"eventloop_duration_cron_sum:%llu\r\n"
|
||||
"eventloop_duration_max:%llu\r\n"
|
||||
"eventloop_cmd_per_cycle_max:%lld\r\n",
|
||||
server.duration_stats[EL_DURATION_TYPE_AOF].sum,
|
||||
server.duration_stats[EL_DURATION_TYPE_CRON].sum,
|
||||
server.duration_stats[EL_DURATION_TYPE_EL].max,
|
||||
server.el_cmd_cnt_max);
|
||||
info = sdscatprintf(info, "# Debug\r\n" FMTARGS(
|
||||
"eventloop_duration_aof_sum:%llu\r\n", server.duration_stats[EL_DURATION_TYPE_AOF].sum,
|
||||
"eventloop_duration_cron_sum:%llu\r\n", server.duration_stats[EL_DURATION_TYPE_CRON].sum,
|
||||
"eventloop_duration_max:%llu\r\n", server.duration_stats[EL_DURATION_TYPE_EL].max,
|
||||
"eventloop_cmd_per_cycle_max:%lld\r\n", server.el_cmd_cnt_max));
|
||||
}
|
||||
|
||||
return info;
|
||||
|
22
utils/generate-fmtargs.py
Executable file
22
utils/generate-fmtargs.py
Executable file
@ -0,0 +1,22 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# Outputs the generated part of src/fmtargs.h
|
||||
MAX_ARGS = 120
|
||||
|
||||
import os
|
||||
print("/* Everything below this line is automatically generated by")
|
||||
print(" * %s. Do not manually edit. */\n" % os.path.basename(__file__))
|
||||
|
||||
print('#define ARG_N(' + ', '.join(['_' + str(i) for i in range(1, MAX_ARGS + 1, 1)]) + ', N, ...) N')
|
||||
|
||||
print('\n#define RSEQ_N() ' + ', '.join([str(i) for i in range(MAX_ARGS, -1, -1)]))
|
||||
|
||||
print('\n#define COMPACT_FMT_2(fmt, value) fmt')
|
||||
for i in range(4, MAX_ARGS + 1, 2):
|
||||
print('#define COMPACT_FMT_{}(fmt, value, ...) fmt COMPACT_FMT_{}(__VA_ARGS__)'.format(i, i - 2))
|
||||
|
||||
print('\n#define COMPACT_VALUES_2(fmt, value) value')
|
||||
for i in range(4, MAX_ARGS + 1, 2):
|
||||
print('#define COMPACT_VALUES_{}(fmt, value, ...) value, COMPACT_VALUES_{}(__VA_ARGS__)'.format(i, i - 2))
|
||||
|
||||
print("\n#endif")
|
Loading…
x
Reference in New Issue
Block a user