Skip to content

Commit bbed733

Browse files
Merge pull request ceph#60731 from joscollin/wip-B68954-check-headers-journal-recovery
cephfs-journal-tool: check the headers in dump file after journal recovery Reviewed-by: Dhairya Parmar <[email protected]> Reviewed-by: Rishabh Dave <[email protected]>
2 parents 8ff8a4a + d3a1f0d commit bbed733

File tree

2 files changed

+48
-6
lines changed

2 files changed

+48
-6
lines changed

qa/tasks/cephfs/test_journal_repair.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,3 +450,28 @@ def test_journal_import_from_invalid_dump_file(self):
450450
raise RuntimeError("Expected journal import to fail")
451451
finally:
452452
self.mount_a.run_shell(["sudo", "rm", fname], omit_sudo=False)
453+
454+
def test_header_check_after_journal_recovery(self):
455+
"""
456+
That the 'journal import' recognizes invalid headers post journal recovery and errors out.
457+
"""
458+
# Create an invalid dump file which doesn't have 'object_size' header
459+
fname = tempfile.NamedTemporaryFile(delete=False).name
460+
self.mount_a.run_shell(["sudo", "sh", "-c", f'printf "Ceph mds0 journal dump\n\
461+
start offset 4194304 (0x400000)\nlength 940 (0x3ac)\nwrite_pos 4194304 (0x400000)\n\
462+
format 1\ntrimmed_pos 4194304 (0x400000)\nstripe_unit 4194304 (0x400000)\nstripe_count 1 (0x1)\n\
463+
fsid 41334b86-2666-4269-a8ea-313bc073564c\n" > {fname}'], omit_sudo=False)
464+
self.fs.fail()
465+
try:
466+
self.fs.journal_tool(["journal", "import", fname, "--force"], 0)
467+
except CommandFailedError as e:
468+
self.fs.set_joinable()
469+
self.fs.wait_for_daemons()
470+
if e.exitstatus != 234:
471+
raise RuntimeError(f"Unexpected journal import error: {str(e)}")
472+
else:
473+
self.fs.set_joinable()
474+
self.fs.wait_for_daemons()
475+
raise RuntimeError("Expected journal import to fail")
476+
finally:
477+
self.mount_a.run_shell(["sudo", "rm", fname], omit_sudo=False)

src/tools/cephfs/Dumper.cc

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -293,24 +293,41 @@ int Dumper::undump(const char *dump_file, bool force)
293293
}
294294

295295
if (recovered == 0) {
296+
//Check if the headers are available in the dump file
297+
if (!strstr(buf, "stripe_unit")) {
298+
derr << "Invalid header, no 'stripe_unit' embedded" << dendl;
299+
::close(fd);
300+
return -EINVAL;
301+
} else if (!strstr(buf, "stripe_count")) {
302+
derr << "Invalid header, no 'stripe_count' embedded" << dendl;
303+
::close(fd);
304+
return -EINVAL;
305+
} else if (!strstr(buf, "object_size")) {
306+
derr << "Invalid header, no 'object_size' embedded" << dendl;
307+
::close(fd);
308+
return -EINVAL;
309+
}
296310
auto&& last_committed = journaler.get_last_committed();
297311
stripe_unit = last_committed.layout.stripe_unit;
298312
stripe_count = last_committed.layout.stripe_count;
299313
object_size = last_committed.layout.object_size;
300314
} else {
301315
// try to get layout from dump file header, if failed set layout to default
302-
if (strstr(buf, "stripe_unit")) {
303-
sscanf(strstr(buf, "stripe_unit"), "stripe_unit %lu", &stripe_unit);
316+
char *p_stripe_unit = strstr(buf, "stripe_unit");
317+
if (p_stripe_unit) {
318+
sscanf(p_stripe_unit, "stripe_unit %lu", &stripe_unit);
304319
} else {
305320
stripe_unit = file_layout_t::get_default().stripe_unit;
306321
}
307-
if (strstr(buf, "stripe_count")) {
308-
sscanf(strstr(buf, "stripe_count"), "stripe_count %lu", &stripe_count);
322+
char *p_stripe_count = strstr(buf, "stripe_count");
323+
if (p_stripe_count) {
324+
sscanf(p_stripe_count, "stripe_count %lu", &stripe_count);
309325
} else {
310326
stripe_count = file_layout_t::get_default().stripe_count;
311327
}
312-
if (strstr(buf, "object_size")) {
313-
sscanf(strstr(buf, "object_size"), "object_size %lu", &object_size);
328+
char *p_object_size = strstr(buf, "object_size");
329+
if (p_object_size) {
330+
sscanf(p_object_size, "object_size %lu", &object_size);
314331
} else {
315332
object_size = file_layout_t::get_default().object_size;
316333
}

0 commit comments

Comments
 (0)