From 7103e74e335652f2a28b1dad0a2f2028398a600d Mon Sep 17 00:00:00 2001 From: David Zafman Date: Thu, 3 Sep 2015 19:43:35 -0700 Subject: [PATCH] osd: Better SnapSet scrub checking (find issues instead of asserting) Signed-off-by: David Zafman (cherry picked from commit 3b381caaad20c683a330e8b7a4e1c017abcb60df) --- src/osd/ReplicatedPG.cc | 48 ++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 15a6ae7c311c1..784b87e248d4c 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -11498,17 +11498,49 @@ void ReplicatedPG::_scrub( dout(20) << __func__ << " " << mode << " matched clone " << soid << dendl; - stat.num_bytes += snapset.get().get_clone_bytes(soid.snap); - - if (oi && oi.get().size != snapset.get().clone_size[*curclone]) { + if (snapset->clone_size.count(soid.snap) == 0) { osd->clog->error() << mode << " " << info.pgid << " " << soid - << " size " << oi.get().size << " != clone_size " - << snapset.get().clone_size[*curclone]; + << " is missing in clone_size"; ++scrubber.shallow_errors; - } + } else { + if (oi && oi->size != snapset->clone_size[soid.snap]) { + osd->clog->error() << mode << " " << info.pgid << " " << soid + << " size " << oi->size << " != clone_size " + << snapset->clone_size[*curclone]; + ++scrubber.shallow_errors; + } - // verify overlap? - // ... + if (snapset->clone_overlap.count(soid.snap) == 0) { + osd->clog->error() << mode << " " << info.pgid << " " << soid + << " is missing in clone_overlap"; + ++scrubber.shallow_errors; + } else { + // This checking is based on get_clone_bytes(). The first 2 asserts + // can't happen because we know we have a clone_size and + // a clone_overlap. Now we check that the interval_set won't + // cause the last assert. + uint64_t size = snapset->clone_size.find(soid.snap)->second; + const interval_set &overlap = + snapset->clone_overlap.find(soid.snap)->second; + bool bad_interval_set = false; + for (interval_set::const_iterator i = overlap.begin(); + i != overlap.end(); ++i) { + if (size < i.get_len()) { + bad_interval_set = true; + break; + } + size -= i.get_len(); + } + + if (bad_interval_set) { + osd->clog->error() << mode << " " << info.pgid << " " << soid + << " bad interval_set in clone_overlap"; + ++scrubber.shallow_errors; + } else { + stat.num_bytes += snapset->get_clone_bytes(soid.snap); + } + } + } // what's next? ++curclone; -- 2.39.5