diff options
| author | Willy Tarreau <w@1wt.eu> | 2023-01-24 12:13:14 +0100 |
|---|---|---|
| committer | Willy Tarreau <w@1wt.eu> | 2023-01-24 12:13:14 +0100 |
| commit | e06ba9031843b6a55df486f5115b6675d71e22f7 (patch) | |
| tree | 8708d1e404d0e43f2c100b310ac98902e4e45199 /dev | |
| parent | fb9a4765b74cc18f25a6b732a66aae952262a7e0 (diff) | |
| download | haproxy-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.c | 12 |
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 |
