summaryrefslogtreecommitdiff
path: root/dev
diff options
context:
space:
mode:
authorWilly Tarreau <w@1wt.eu>2023-01-24 12:13:14 +0100
committerWilly Tarreau <w@1wt.eu>2023-01-24 12:13:14 +0100
commite06ba9031843b6a55df486f5115b6675d71e22f7 (patch)
tree8708d1e404d0e43f2c100b310ac98902e4e45199 /dev
parentfb9a4765b74cc18f25a6b732a66aae952262a7e0 (diff)
downloadhaproxy-e06ba9031843b6a55df486f5115b6675d71e22f7.tar.gz
DEV: haring: add a new option "-r" to automatically repair broken files
In case a file-backed ring was not properly synced before being dumped, the output can look bogus due to the head pointer not being perfectly up to date. In this case, passing "-r" will make haring automatically skip entries not starting with a zero, and resynchronize with the rest of the messages. This should be backported to 2.6.
Diffstat (limited to 'dev')
-rw-r--r--dev/haring/haring.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/dev/haring/haring.c b/dev/haring/haring.c
index 27e03eecf..53352cbd1 100644
--- a/dev/haring/haring.c
+++ b/dev/haring/haring.c
@@ -37,6 +37,7 @@
int force = 0; // force access to a different layout
int lfremap = 0; // remap LF in traces
+int repair = 0; // repair file
/* display the message and exit with the code */
@@ -61,6 +62,7 @@ __attribute__((noreturn)) void usage(int code, const char *arg0)
"options :\n"
" -f : force accessing a non-matching layout for 'ring struct'\n"
" -l : replace LF in contents with CR VT\n"
+ " -r : \"repair\" corrupted file (actively search for message boundaries)\n"
"\n"
"", arg0);
}
@@ -146,6 +148,14 @@ int dump_ring(struct ring *ring, size_t ofs, int flags)
* stop before the end.
*/
while (ofs + 1 < b_data(&buf)) {
+ if (unlikely(repair && *b_peek(&buf, ofs))) {
+ /* in repair mode we consider that we could have landed
+ * in the middle of a message so we skip all bytes till
+ * the next zero.
+ */
+ ofs++;
+ continue;
+ }
cnt = 1;
len = b_peek_varint(&buf, ofs + cnt, &msg_len);
if (!len)
@@ -219,6 +229,8 @@ int main(int argc, char **argv)
force = 1;
else if (strcmp(argv[0], "-l") == 0)
lfremap = 1;
+ else if (strcmp(argv[0], "-r") == 0)
+ repair = 1;
else if (strcmp(argv[0], "--") == 0)
break;
else