mirror of
https://github.com/ceph/ceph
synced 2025-01-04 02:02:36 +00:00
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 <sjust@redhat.com>
This commit is contained in:
parent
27bdc8ce6d
commit
6d410e9723
@ -4024,6 +4024,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;
|
||||
@ -4353,7 +4355,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);
|
||||
|
@ -5099,9 +5099,9 @@ void ScrubMap::decode(bufferlist::iterator& bl, int64_t pool)
|
||||
|
||||
// handle hobject_t upgrade
|
||||
if (struct_v < 3) {
|
||||
map<hobject_t, object, hobject_t::BitwiseComparator> tmp;
|
||||
map<hobject_t, object, hobject_t::ComparatorWithDefault> tmp;
|
||||
tmp.swap(objects);
|
||||
for (map<hobject_t, object, hobject_t::BitwiseComparator>::iterator i = tmp.begin();
|
||||
for (map<hobject_t, object, hobject_t::ComparatorWithDefault>::iterator i = tmp.begin();
|
||||
i != tmp.end();
|
||||
++i) {
|
||||
hobject_t first(i->first);
|
||||
@ -5117,7 +5117,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<hobject_t,object, hobject_t::BitwiseComparator>::const_iterator p = objects.begin(); p != objects.end(); ++p) {
|
||||
for (map<hobject_t,object, hobject_t::ComparatorWithDefault>::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());
|
||||
|
@ -4397,10 +4397,15 @@ struct ScrubMap {
|
||||
};
|
||||
WRITE_CLASS_ENCODER(object)
|
||||
|
||||
map<hobject_t,object, hobject_t::BitwiseComparator> objects;
|
||||
bool bitwise; // ephemeral, not encoded
|
||||
map<hobject_t,object, hobject_t::ComparatorWithDefault> 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());
|
||||
@ -4414,6 +4419,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<hobject_t, object, hobject_t::ComparatorWithDefault> new_objects(
|
||||
objects.begin(),
|
||||
objects.end(),
|
||||
hobject_t::ComparatorWithDefault(new_bitwise));
|
||||
::swap(new_objects, objects);
|
||||
bitwise = new_bitwise;
|
||||
}
|
||||
static void generate_test_instances(list<ScrubMap*>& o);
|
||||
};
|
||||
WRITE_CLASS_ENCODER(ScrubMap::object)
|
||||
|
Loading…
Reference in New Issue
Block a user