From 0e2338e5ec5441e5fc173a7af69343c775b02a13 Mon Sep 17 00:00:00 2001 From: David Zafman Date: Mon, 3 Oct 2016 14:34:19 -0700 Subject: [PATCH] osd_types,PG: force the map used in _scrub to be sorted correctly Previously, ScrubMap::objects was always sorted bitwise (nibblewise before the comparator change was made. It didn't matter because we always scrubbed whole hash values. Now, we need the objects in the objectstore ordering because we may be missing objects at the tail of the scanned range and need them to show up at the tail of the ScrubMap::objects mapping. We don't need to do anything else to handle the upgrade process since the actual objects *in* the map were determined by the objectstore ordering. Signed-off-by: Samuel Just (cherry picked from commit 6d410e97232afdad4f226151333b209d8b50f4ed) --- src/osd/PG.cc | 4 +++- src/osd/osd_types.cc | 6 +++--- src/osd/osd_types.h | 17 ++++++++++++++++- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 597f456fadd50..c5b73247251d6 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -4078,6 +4078,8 @@ void PG::chunky_scrub(ThreadPool::TPHandle &handle) case PG::Scrubber::INACTIVE: dout(10) << "scrub start" << dendl; + scrubber.cleaned_meta_map.reset_bitwise(get_sort_bitwise()); + publish_stats_to_osd(); scrubber.epoch_start = info.history.same_interval_since; scrubber.active = true; @@ -4407,7 +4409,7 @@ void PG::scrub_compare_maps() } } - ScrubMap for_meta_scrub; + ScrubMap for_meta_scrub(get_sort_bitwise()); if (scrubber.end.is_max() || scrubber.cleaned_meta_map.objects.empty()) { scrubber.cleaned_meta_map.swap(for_meta_scrub); diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index 7ff99cbd23b22..2334b70ed33b9 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -5292,9 +5292,9 @@ void ScrubMap::decode(bufferlist::iterator& bl, int64_t pool) // handle hobject_t upgrade if (struct_v < 3) { - map tmp; + map tmp; tmp.swap(objects); - for (map::iterator i = tmp.begin(); + for (map::iterator i = tmp.begin(); i != tmp.end(); ++i) { hobject_t first(i->first); @@ -5310,7 +5310,7 @@ void ScrubMap::dump(Formatter *f) const f->dump_stream("valid_through") << valid_through; f->dump_stream("incremental_since") << incr_since; f->open_array_section("objects"); - for (map::const_iterator p = objects.begin(); p != objects.end(); ++p) { + for (map::const_iterator p = objects.begin(); p != objects.end(); ++p) { f->open_object_section("object"); f->dump_string("name", p->first.oid.name); f->dump_unsigned("hash", p->first.get_hash()); diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 3ebff3dfb7955..1c5d71db308be 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -4056,10 +4056,15 @@ struct ScrubMap { }; WRITE_CLASS_ENCODER(object) - map objects; + bool bitwise; // ephemeral, not encoded + map objects; eversion_t valid_through; eversion_t incr_since; + ScrubMap() : bitwise(true) {} + ScrubMap(bool bitwise) + : bitwise(bitwise), objects(hobject_t::ComparatorWithDefault(bitwise)) {} + void merge_incr(const ScrubMap &l); void insert(const ScrubMap &r) { objects.insert(r.objects.begin(), r.objects.end()); @@ -4073,6 +4078,16 @@ struct ScrubMap { void encode(bufferlist& bl) const; void decode(bufferlist::iterator& bl, int64_t pool=-1); void dump(Formatter *f) const; + void reset_bitwise(bool new_bitwise) { + if (bitwise == new_bitwise) + return; + map new_objects( + objects.begin(), + objects.end(), + hobject_t::ComparatorWithDefault(new_bitwise)); + ::swap(new_objects, objects); + bitwise = new_bitwise; + } static void generate_test_instances(list& o); }; WRITE_CLASS_ENCODER(ScrubMap::object) -- 2.39.5