From 0996038bff9d0c99164bf2c392298904bfd87670 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Mon, 17 Oct 2016 15:30:20 +0800 Subject: [PATCH] mds: fix false 'bad backtrace' warnings during online scrub Only inode's direct parent in backtrace is supposed to be uptodate. The rest back pointers in backtrace are hints, they can be stale. The scrub code prints warning when inode's on-disk backtrace is not equivalent to inode's current path. This check is too strange, it causes lots of false warnings for workload that does directory rename. Fixes: http://tracker.ceph.com/issues/17562 Signed-off-by: Yan, Zheng --- src/mds/CInode.cc | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 5dcdcb1577f2..feb4530c5741 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -3840,15 +3840,11 @@ void CInode::validate_disk_state(CInode::validated_data *results, memory_newer = memory_backtrace.compare(results->backtrace.ondisk_value, &equivalent, &divergent); - if (equivalent) { - results->backtrace.passed = true; + if (divergent || memory_newer < 0) { + // we're divergent, or on-disk version is newer + results->backtrace.error_str << "On-disk backtrace is divergent or newer"; } else { - if (divergent || memory_newer <= 0) { - // we're divergent, or don't have a newer version to write - results->backtrace.error_str << - "On-disk backtrace is divergent or newer"; - goto next; - } + results->backtrace.passed = true; } next: // If the inode's number was free in the InoTable, fix that -- 2.47.3