summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2020-05-05 13:40:33 +0200
committerantirez <antirez@gmail.com>2020-05-05 13:40:33 +0200
commit51ab31dbabd925550d2c41f15c53832b4ad8982b (patch)
treed5b7600f26e100d166ae17eafa7ad98fa7e99e40
parent415c4f613cfc50bffc658b3e37047d155c0831dd (diff)
downloadredis-51ab31dbabd925550d2c41f15c53832b4ad8982b.tar.gz
Dump recent backlog on master query generating errors.
-rw-r--r--src/networking.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/networking.c b/src/networking.c
index fd1159e06..75c0c16b1 100644
--- a/src/networking.c
+++ b/src/networking.c
@@ -393,6 +393,35 @@ void addReplyErrorLength(client *c, const char *s, size_t len) {
serverLog(LL_WARNING,"== CRITICAL == This %s is sending an error "
"to its %s: '%s' after processing the command "
"'%s'", from, to, s, cmdname);
+ if (ctype == CLIENT_TYPE_MASTER && server.repl_backlog &&
+ server.repl_backlog_histlen > 0)
+ {
+ long long dumplen = 256;
+ if (server.repl_backlog_histlen < dumplen)
+ dumplen = server.repl_backlog_histlen;
+
+ /* Identify the first byte to dump. */
+ long long idx =
+ (server.repl_backlog_idx + (server.repl_backlog_size - dumplen)) %
+ server.repl_backlog_size;
+
+ /* Scan the circular buffer to collect 'dumplen' bytes. */
+ sds dump = sdsempty();
+ while(dumplen) {
+ long long thislen =
+ ((server.repl_backlog_size - idx) < dumplen) ?
+ (server.repl_backlog_size - idx) : dumplen;
+
+ dump = sdscatrepr(dump,server.repl_backlog+idx,thislen);
+ dumplen -= thislen;
+ idx = 0;
+ }
+
+ /* Finally log such bytes: this is vital debugging info to
+ * understand what happened. */
+ serverLog(LL_WARNING,"Latest backlog is: '%s'", dump);
+ sdsfree(dump);
+ }
server.stat_unexpected_error_replies++;
}
}