]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
io_exerciser: Handle the Remove case inside of the exerciser_model->applyIoOp method... 65912/head
authorMatty Williams <Matty.Williams@ibm.com>
Mon, 5 Jan 2026 15:47:26 +0000 (15:47 +0000)
committerMatty Williams <Matty.Williams@ibm.com>
Mon, 5 Jan 2026 15:47:26 +0000 (15:47 +0000)
Fixes: https://tracker.ceph.com/issues/73520
Signed-off-by: Matty Williams <Matty.Williams@ibm.com>
src/common/io_exerciser/Model.cc
src/common/io_exerciser/Model.h
src/common/io_exerciser/ObjectModel.cc
src/common/io_exerciser/ObjectModel.h
src/common/io_exerciser/RadosIo.cc
src/common/io_exerciser/RadosIo.h
src/test/osd/ceph_test_rados_io_sequence/ceph_test_rados_io_sequence.cc
src/test/osd/ceph_test_rados_io_sequence/ceph_test_rados_io_sequence.h

index e0dc9b0b4ce823d6ce7ca6230d0b8eb6510bc872..dfa113d8c34267c1981a3b26fb42f538e1453c7e 100644 (file)
@@ -5,8 +5,11 @@
 
 using Model = ceph::io_exerciser::Model;
 
-Model::Model(const std::string& primary_oid, const std::string& secondary_oid, uint64_t block_size)
-    : num_io(0), primary_oid(primary_oid), secondary_oid(secondary_oid), block_size(block_size) {}
+Model::Model(const std::string& primary_oid, const std::string& secondary_oid,
+             uint64_t block_size, bool delete_objects)
+    : num_io(0), primary_oid_base(primary_oid), primary_oid(primary_oid), secondary_oid(secondary_oid),
+      block_size(block_size), delete_objects(delete_objects)
+{}
 
 const std::string Model::get_primary_oid() const { return primary_oid; }
 
index 9db80df1dd724bbc59b751667b52b6b986778014..23ff35b3603b7e18043d84fbd68c327a12a2be86 100644 (file)
@@ -29,12 +29,16 @@ class IoOp;
 class Model {
  protected:
   int num_io{0};
+  std::string primary_oid_base;
   std::string primary_oid;
   std::string secondary_oid;
   uint64_t block_size;
+  bool delete_objects;
+  int num_objects{0};
 
  public:
-  Model(const std::string& primary_oid, const std::string& secondary_oid, uint64_t block_size);
+  Model(const std::string& primary_oid, const std::string& secondary_oid,
+        uint64_t block_size, bool delete_objects);
   virtual ~Model() = default;
 
   virtual bool readyForIoOp(IoOp& op) = 0;
index 17b025601447d473ad0ee947a729ee180585f01f..7f155d12220369d91dad66d36bde002ce6686ce8 100644 (file)
@@ -7,23 +7,12 @@
 
 using ObjectModel = ceph::io_exerciser::ObjectModel;
 
-ObjectModel::ObjectModel(const std::string& primary_oid, const std::string& secondary_oid, uint64_t block_size, int seed)
-    : Model(primary_oid, secondary_oid, block_size), primary_created(false), secondary_created(false) {
+ObjectModel::ObjectModel(const std::string& primary_oid, const std::string& secondary_oid,
+                         uint64_t block_size, int seed, bool delete_objects)
+    : Model(primary_oid, secondary_oid, block_size, delete_objects), primary_created(false), secondary_created(false) {
   rng.seed(seed);
 }
 
-void ObjectModel::set_primary_oid(const std::string& new_oid) {
-  Model::set_primary_oid(new_oid);
-  primary_created = false;
-  primary_contents.resize(0);
-}
-
-void ObjectModel::set_secondary_oid(const std::string& new_oid) {
-  Model::set_secondary_oid(new_oid);
-  secondary_created = false;
-  secondary_contents.resize(0);
-}
-
 int ObjectModel::get_seed(uint64_t offset) const {
   ceph_assert(offset < primary_contents.size());
   return primary_contents[offset];
@@ -171,13 +160,17 @@ void ObjectModel::applyIoOp(IoOp& op) {
       }
     } break;
 
-    case OpType::Remove:
+    case OpType::Remove: {
       ceph_assert(primary_created);
       ceph_assert(reads.empty());
       ceph_assert(writes.empty());
+      if (!delete_objects) {
+        const std::string new_primary_oid = primary_oid_base + "_" + std::to_string(++num_objects);
+        set_primary_oid(new_primary_oid);
+      }
       primary_created = false;
       primary_contents.resize(0);
-      break;
+    } break;
       
     case OpType::Read: {
       SingleReadOp& readOp = static_cast<SingleReadOp&>(op);
index 8e6a54dfcd45196b816714fae8d5368ca24040a6..e16658085b6ea6fa6fe767f6c19a16cb4b6fc9e7 100644 (file)
@@ -45,10 +45,8 @@ class ObjectModel : public Model {
   interval_set<uint64_t> writes;
 
  public:
-  ObjectModel(const std::string& primary_oid, const std::string& secondary_oid, uint64_t block_size, int seed);
-
-  void set_primary_oid(const std::string& new_oid) override;
-  void set_secondary_oid(const std::string& new_oid) override;
+  ObjectModel(const std::string& primary_oid, const std::string& secondary_oid,
+              uint64_t block_size, int seed, bool delete_objects = true);
 
   int get_seed(uint64_t offset) const;
   std::vector<int> get_seed_offsets(int seed) const;
index 91fbb08ac9dfffe74be52090fa029fb9a635e554..24be675c1843694aa9be0fcad8e8f529bffd1fb0 100644 (file)
@@ -46,11 +46,11 @@ RadosIo::RadosIo(librados::Rados& rados, boost::asio::io_context& asio,
                  const std::string& pool, const std::string& primary_oid, const std::string& secondary_oid,
                  uint64_t block_size, int seed, int threads, ceph::mutex& lock,
                  ceph::condition_variable& cond, bool is_replicated_pool,
-                 bool ec_optimizations)
-    : Model(primary_oid, secondary_oid, block_size),
+                 bool ec_optimizations, bool delete_objects)
+    : Model(primary_oid, secondary_oid, block_size, delete_objects),
       rados(rados),
       asio(asio),
-      om(std::make_unique<ObjectModel>(primary_oid, secondary_oid, block_size, seed)),
+      om(std::make_unique<ObjectModel>(primary_oid, secondary_oid, block_size, seed, delete_objects)),
       db(data_generation::DataGenerator::create_generator(
           data_generation::GenerationType::HeaderedSeededRandom, *om)),
       pool(pool),
@@ -68,16 +68,6 @@ RadosIo::RadosIo(librados::Rados& rados, boost::asio::io_context& asio,
 
 RadosIo::~RadosIo() {}
 
-void RadosIo::set_primary_oid(const std::string& new_oid) {
-  Model::set_primary_oid(new_oid);
-  om->set_primary_oid(new_oid);
-}
-
-void RadosIo::set_secondary_oid(const std::string& new_oid) {
-  Model::set_secondary_oid(new_oid);
-  om->set_secondary_oid(new_oid);
-}
-
 void RadosIo::start_io() {
   std::lock_guard l(lock);
   outstanding_io++;
@@ -171,6 +161,11 @@ void RadosIo::applyIoOp(IoOp& op) {
     }
 
     case OpType::Remove: {
+      if (!delete_objects) {
+        const std::string new_primary_oid = primary_oid_base + "_" + std::to_string(++num_objects);
+        set_primary_oid(new_primary_oid);
+        break;
+      }
       start_io();
       auto op_info = std::make_shared<AsyncOpInfo<0>>();
       librados::ObjectWriteOperation wop;
index ceb524387c0880f2de55644d9bad761dea428a56..f44216d138b2ab13cdebe1d648ec0648c60dcf9d 100644 (file)
@@ -47,13 +47,10 @@ class RadosIo : public Model {
           const std::string& pool, const std::string& primary_oid, const std::string& secondary_oid,
           uint64_t block_size, int seed, int threads, ceph::mutex& lock,
           ceph::condition_variable& cond, bool is_replicated_pool,
-          bool ec_optimizations);
+          bool ec_optimizations, bool delete_objects = true);
 
   ~RadosIo();
 
-  void set_primary_oid(const std::string& new_oid) override;
-  void set_secondary_oid(const std::string& new_oid) override;
-
   void allow_ec_overwrites(bool allow);
   void allow_ec_optimizations();
 
index 4a42418655770a60c0ad168d43246a7933093ee3..709f6e5e6932e14433b6fbd92d5ea711ef964bb8 100644 (file)
@@ -1026,12 +1026,12 @@ ceph::io_sequence::tester::TestObject::TestObject(
     SelectObjectSize& sos, SelectNumThreads& snt, SelectSeqRange& ssr,
     ceph::util::random_number_generator<int>& rng, ceph::mutex& lock,
     ceph::condition_variable& cond, bool dryrun, bool verbose,
-    std::optional<int> seqseed, bool testrecovery, bool checkconsistency, bool dontdeleteobjects)
-    : rng(rng), verbose(verbose), seqseed(seqseed), primary_oid(primary_oid), secondary_oid(secondary_oid),
-      testrecovery(testrecovery), checkconsistency(checkconsistency), dontdeleteobjects(dontdeleteobjects) {
+    std::optional<int> seqseed, bool testrecovery, bool checkconsistency, bool delete_objects)
+    : rng(rng), verbose(verbose), seqseed(seqseed), testrecovery(testrecovery), checkconsistency(checkconsistency),
+      delete_objects(delete_objects) {
   if (dryrun) {
     exerciser_model = std::make_unique<ceph::io_exerciser::ObjectModel>(
-        primary_oid, secondary_oid, sbs.select(), rng());
+        primary_oid, secondary_oid, sbs.select(), rng(), delete_objects);
   } else {
     const std::string pool = spo.select();
     if (!dryrun) {
@@ -1053,7 +1053,7 @@ ceph::io_sequence::tester::TestObject::TestObject(
     exerciser_model = std::make_unique<ceph::io_exerciser::RadosIo>(
         rados, asio, pool, primary_oid, secondary_oid, sbs.select(), rng(),
         threads, lock, cond, spo.is_replicated_pool(),
-        spo.get_allow_pool_ec_optimizations());
+        spo.get_allow_pool_ec_optimizations(), delete_objects);
     dout(0) << "= " << primary_oid << " pool=" << pool << " threads=" << threads
             << " blocksize=" << exerciser_model->get_block_size() << " ="
             << dendl;
@@ -1062,9 +1062,6 @@ ceph::io_sequence::tester::TestObject::TestObject(
   seq_range = ssr.select();
   curseq = seq_range.first;
 
-  object_counter = 0;
-  primary_oid_base = primary_oid;
-
   if (testrecovery) {
     seq = ceph::io_exerciser::EcIoSequence::generate_sequence(
         curseq, obj_size_range, pool_km, pool_mappinglayers,
@@ -1095,13 +1092,7 @@ bool ceph::io_sequence::tester::TestObject::next() {
               << ": " << op->to_string(exerciser_model->get_block_size())
               << dendl;
     }
-    if (dontdeleteobjects && op->getOpType() == ceph::io_exerciser::OpType::Remove) {
-      // Change the primary_oid so that the next object will be created with a different name
-      primary_oid = primary_oid_base + "_" + std::to_string(object_counter++);
-      exerciser_model->set_primary_oid(primary_oid);
-    } else {
-      exerciser_model->applyIoOp(*op);
-    }
+    exerciser_model->applyIoOp(*op);
     if (op->getOpType() == ceph::io_exerciser::OpType::Done) {
       curseq = seq->getNextSupportedSequenceId();
       if (curseq >= seq_range.second) {
@@ -1163,7 +1154,7 @@ ceph::io_sequence::tester::TestRunner::TestRunner(
 
   verbose = vm.contains("verbose");
   dryrun = vm.contains("dryrun");
-  dont_delete_objects = vm.contains("dont_delete_objects");
+  delete_objects = !vm.contains("dont_delete_objects");
 
   seqseed = std::nullopt;
   if (vm.contains("seqseed")) {
@@ -1486,7 +1477,7 @@ bool ceph::io_sequence::tester::TestRunner::run_automated_test() {
       test_objects.push_back(
           std::make_shared<ceph::io_sequence::tester::TestObject>(
               primary_name, secondary_name, rados, asio, sbs, spo, sos, snt, ssr, rng, lock, cond,
-              dryrun, verbose, seqseed, testrecovery, checkconsistency, dont_delete_objects));
+              dryrun, verbose, seqseed, testrecovery, checkconsistency, delete_objects));
     }
     catch (const std::runtime_error &e) {
       std::cerr << "Error: " << e.what() << std::endl;
index 34d82becd1c5e40bafa04c88e015957a48062513..a48564f5c6df84296a3cc8432602e07727be8605 100644 (file)
@@ -461,7 +461,7 @@ class TestObject {
              std::optional<int> seqseed,
              bool testRecovery,
              bool checkConsistency,
-             bool dontDeleteObjects);
+             bool delete_objects);
 
   int get_num_io();
   bool readyForIo();
@@ -485,11 +485,7 @@ class TestObject {
       pool_mappinglayers;
   bool testrecovery;
   bool checkconsistency;
-  bool dontdeleteobjects;
-  std::string primary_oid_base;
-  std::string primary_oid;
-  std::string secondary_oid;
-  int object_counter;
+  bool delete_objects;
 };
 
 class TestRunner {
@@ -524,7 +520,7 @@ class TestRunner {
 
   bool verbose;
   bool dryrun;
-  bool dont_delete_objects;
+  bool delete_objects;
   std::optional<int> seqseed;
   bool interactive;