From: David Zafman Date: Sat, 28 Apr 2018 22:44:06 +0000 (-0700) Subject: osd: If ending on a head object get all of meta map X-Git-Tag: v13.1.0~1^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F21546%2Fhead;p=ceph.git osd: If ending on a head object get all of meta map When ending on a head object, the head and snapshots would stay in cleaned_meta_map until more maps arrive. The problem as that during a scrub an eviction could occur because scrubber.start is already past the stray object(s) so range_intersects_scrub() is false. Fixes: http://tracker.ceph.com/issues/23909 Signed-off-by: David Zafman --- diff --git a/src/osd/PG.h b/src/osd/PG.h index 9e6fe7cb5f7b..06a500185664 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -1601,11 +1601,15 @@ public: auto iter = cleaned_meta_map.objects.end(); --iter; // not empty, see if clause auto begin = cleaned_meta_map.objects.begin(); - while (iter != begin) { - auto next = iter--; - if (next->first.get_head() != iter->first.get_head()) { - ++iter; - break; + if (iter->first.has_snapset()) { + ++iter; + } else { + while (iter != begin) { + auto next = iter--; + if (next->first.get_head() != iter->first.get_head()) { + ++iter; + break; + } } } for_meta_scrub.objects.insert(begin, iter);