From 83861a5b75ddb98366f1ec106487b88703f25cf7 Mon Sep 17 00:00:00 2001 From: David Zafman Date: Sat, 28 Apr 2018 15:44:06 -0700 Subject: [PATCH] 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 --- src/osd/PG.h | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) 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); -- 2.47.3