]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Improve imitator's extent handling
authortridao <daominhtri0503@gmail.com>
Tue, 20 Jun 2023 01:04:56 +0000 (22:04 -0300)
committertridao <daominhtri0503@gmail.com>
Tue, 20 Jun 2023 17:30:14 +0000 (14:30 -0300)
- Appending new extents now will sort all extents by offset
- Add methods to verify extents correctness in a Collection

Signed-off-by: Tri Dao <daominhtri0503@gmail.com>
src/test/objectstore/Fragmentation_simulator.cc
src/test/objectstore/ObjectStoreImitator.cc
src/test/objectstore/ObjectStoreImitator.h

index f29404dfe55d4710e67ed417e6d23fe1a6a226e2..89fb89d77927b7161681a7d4e77d7eadc654f526 100644 (file)
@@ -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;
   }
 };
index f95389786aca8e3c8bb26c29bf16a885be6e6cdc..204acf6c53347e3e5bdc8e598a8debd76e6aa1e2 100644 (file)
@@ -29,6 +29,11 @@ void ObjectStoreImitator::print_status() {
             << std::dec << std::endl;
 }
 
+void ObjectStoreImitator::verify_objects(CollectionHandle &ch) {
+  Collection *c = static_cast<Collection *>(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;
index a26deef277ff5a4c95286e5b227773ef9a30cae9..e134fc4be0080181eede3b9994dfdc893bfae0f7 100644 (file)
@@ -10,6 +10,7 @@
 #include "os/ObjectStore.h"
 #include "os/bluestore/Allocator.h"
 #include "os/bluestore/bluestore_types.h"
+#include <algorithm>
 #include <boost/smart_ptr/intrusive_ptr.hpp>
 
 /**
@@ -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<Object> 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