From: tridao Date: Tue, 20 Jun 2023 01:04:56 +0000 (-0300) Subject: Improve imitator's extent handling X-Git-Tag: v19.0.0~874^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7efc57201165ead5cc53f656e3009e37131889b9;p=ceph.git Improve imitator's extent handling - Appending new extents now will sort all extents by offset - Add methods to verify extents correctness in a Collection Signed-off-by: Tri Dao --- diff --git a/src/test/objectstore/Fragmentation_simulator.cc b/src/test/objectstore/Fragmentation_simulator.cc index f29404dfe55d..89fb89d77927 100644 --- a/src/test/objectstore/Fragmentation_simulator.cc +++ b/src/test/objectstore/Fragmentation_simulator.cc @@ -125,9 +125,11 @@ struct SimpleCWGenerator : public FragmentationSimulator::WorkloadGenerator { } os->queue_transactions(ch, tls); + os->verify_objects(ch); // reapply os->queue_transactions(ch, tls); + os->verify_objects(ch); tls.clear(); // Overwrite on object @@ -139,6 +141,7 @@ struct SimpleCWGenerator : public FragmentationSimulator::WorkloadGenerator { } os->queue_transactions(ch, tls); + os->verify_objects(ch); tls.clear(); for (unsigned i{0}; i < 50; ++i) { @@ -151,6 +154,7 @@ struct SimpleCWGenerator : public FragmentationSimulator::WorkloadGenerator { } os->queue_transactions(ch, tls); + os->verify_objects(ch); return 0; } }; diff --git a/src/test/objectstore/ObjectStoreImitator.cc b/src/test/objectstore/ObjectStoreImitator.cc index f95389786aca..204acf6c5334 100644 --- a/src/test/objectstore/ObjectStoreImitator.cc +++ b/src/test/objectstore/ObjectStoreImitator.cc @@ -29,6 +29,11 @@ void ObjectStoreImitator::print_status() { << std::dec << std::endl; } +void ObjectStoreImitator::verify_objects(CollectionHandle &ch) { + Collection *c = static_cast(ch.get()); + c->verify_objects(); +} + // ------- Transactions ------- int ObjectStoreImitator::queue_transactions(CollectionHandle &ch, @@ -434,9 +439,7 @@ int ObjectStoreImitator::_do_alloc_write(CollectionRef coll, ObjectRef &o, } } - for (auto &p : extents) { - o->extents.push_back(p); - } + o->append(extents); if (prealloc_left > 0) { PExtentVector old_extents; diff --git a/src/test/objectstore/ObjectStoreImitator.h b/src/test/objectstore/ObjectStoreImitator.h index a26deef277ff..e134fc4be008 100644 --- a/src/test/objectstore/ObjectStoreImitator.h +++ b/src/test/objectstore/ObjectStoreImitator.h @@ -10,6 +10,7 @@ #include "os/ObjectStore.h" #include "os/bluestore/Allocator.h" #include "os/bluestore/bluestore_types.h" +#include #include /** @@ -84,6 +85,28 @@ private: extents = remains; old_extents = to_be_punched; } + + void append(PExtentVector &ext) { + for (auto &e : ext) { + extents.push_back(e); + } + + std::sort(extents.begin(), extents.end(), + [](bluestore_pextent_t &a, bluestore_pextent_t &b) { + return a.offset < b.offset; + }); + } + + void verify_extents() { + uint64_t total{0}; + for (auto &e : extents) { + ceph_assert(total <= e.offset); + ceph_assert(e.length > 0); + total += e.length; + } + + ceph_assert(total = size); + } }; typedef boost::intrusive_ptr ObjectRef; @@ -158,6 +181,12 @@ private: o->oid = new_oid; } + void verify_objects() { + for (auto &[_, obj] : objects) { + obj->verify_extents(); + } + } + Collection(ObjectStoreImitator *sim_, coll_t cid_) : CollectionImpl(sim_->cct, cid_), exists(true), commit_queue(nullptr) { } @@ -233,6 +262,7 @@ public: void init_alloc(const std::string &alloc_type, int64_t size); void print_status(); + void verify_objects(CollectionHandle &ch); // Overrides