]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
io_exerciser: Use shared pointer to IoSequence object to avoid updating the Sequence... 65939/head
authorMatty Williams <Matty.Williams@ibm.com>
Mon, 5 Jan 2026 17:19:50 +0000 (17:19 +0000)
committerMatty Williams <Matty.Williams@ibm.com>
Wed, 25 Mar 2026 15:57:55 +0000 (15:57 +0000)
https://tracker.ceph.com/issues/73534
Signed-off-by: Matty Williams <Matty.Williams@ibm.com>
src/common/io_exerciser/DataGenerator.cc
src/common/io_exerciser/DataGenerator.h
src/common/io_exerciser/Model.cc
src/common/io_exerciser/Model.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 f337a76d486914aa23daa942ceebd9125da78cf9..292a4222f0378e65e80d3dc95497ceeecc6bc523 100644 (file)
@@ -8,7 +8,6 @@
 #include <stdexcept>
 
 #include "ObjectModel.h"
-#include "IoSequence.h"
 #include "common/debug.h"
 #include "common/dout.h"
 #include "fmt/format.h"
@@ -52,7 +51,7 @@ bufferlist DataGenerator::generate_wrong_data(uint64_t offset,
 
 bool DataGenerator::validate(bufferlist& bufferlist, uint64_t offset,
                              uint64_t length, std::string_view pool,
-                             ceph::io_exerciser::Sequence curseq, int step) {
+                             ceph::io_exerciser::Sequence seq, int step) {
   return bufferlist.contents_equal(generate_data(offset, length));
 }
 
@@ -216,8 +215,7 @@ HeaderedSeededRandomGenerator::readDateTime(uint64_t block_offset,
 
 bool HeaderedSeededRandomGenerator::validate(bufferlist& bufferlist, uint64_t offset, 
                                              uint64_t length, std::string_view pool,
-                                             ceph::io_exerciser::Sequence curseq,
-                                             int step) {
+                                             Sequence seq, int step) {
   std::vector<uint64_t> invalid_block_offsets;
 
   for (uint64_t block_offset = offset; block_offset < offset + length;
@@ -232,8 +230,11 @@ bool HeaderedSeededRandomGenerator::validate(bufferlist& bufferlist, uint64_t of
 
   if (!invalid_block_offsets.empty()) {
     dout(0) << "Miscompare for read of oid=" << m_model.get_primary_oid() <<
-      " offset=" << offset << " length=" << length << " pool=" << pool << 
-      ". This occured in test=" << curseq << " step=" << step << dendl;
+      " offset=" << offset << " length=" << length << " pool=" << pool <<
+      (seq != Sequence::SEQUENCE_END ? " sequence=" : "") <<
+      (seq != Sequence::SEQUENCE_END ? std::to_string((int)seq) : "") <<
+      (step != -1 ? " step=" : "") <<
+      (step != -1 ? std::to_string(step) : "") << dendl;
     printDebugInformationForOffsets(offset, invalid_block_offsets, bufferlist);
   }
 
index 9a8bae7e2cca37ac7e10373ec736eb829295b6fb..31413438639954f7a093fe572128a2852b78a27f 100644 (file)
@@ -48,7 +48,7 @@ class DataGenerator {
   virtual bufferlist generate_data(uint64_t length, uint64_t offset) = 0;
   virtual bool validate(bufferlist& bufferlist, uint64_t offset,
                         uint64_t length, std::string_view pool,
-                        ceph::io_exerciser::Sequence curseq, int step);
+                        ceph::io_exerciser::Sequence seq, int step);
 
   // Used for testing debug outputs from data generation
   virtual bufferlist generate_wrong_data(uint64_t offset, uint64_t length);
@@ -82,7 +82,7 @@ class HeaderedSeededRandomGenerator : public SeededRandomGenerator {
   bufferptr generate_wrong_block(uint64_t offset) override;
   bool validate(bufferlist& bufferlist, uint64_t offset,
                 uint64_t length, std::string_view pool, 
-                ceph::io_exerciser::Sequence curseq, int step) override;
+                ceph::io_exerciser::Sequence seq, int step) override;
 
  private:
   using UniqueIdBytes = uint64_t;
index d8a51f52e95530502fb1e1bd67b99e030aeb9f92..dfa113d8c34267c1981a3b26fb42f538e1453c7e 100644 (file)
@@ -33,8 +33,3 @@ void Model::swap_primary_secondary_oid() {
 const uint64_t Model::get_block_size() const { return block_size; }
 
 int Model::get_num_io() const { return num_io; }
-
-void Model::set_test_step(ceph::io_exerciser::Sequence new_seq, int new_step) {
-  curseq = new_seq;
-  step = new_step;
-}
index 173c61fb8bce41b74c06109ffbda6c0d33276670..1415ebd8fbc2e9cb88b190cda08321f734bbbb17 100644 (file)
@@ -34,8 +34,6 @@ class Model {
   std::string primary_oid;
   std::string secondary_oid;
   uint64_t block_size;
-  ceph::io_exerciser::Sequence curseq;
-  int step;
   bool delete_objects;
   int num_objects{0};
 
@@ -49,10 +47,6 @@ class Model {
 
   virtual bool readyForIoOp(IoOp& op) = 0;
   virtual void applyIoOp(IoOp& op) = 0;
-  void set_test_step(ceph::io_exerciser::Sequence new_seq, int new_step);
-
-  virtual void set_primary_oid(const std::string& new_oid);
-  virtual void set_secondary_oid(const std::string& new_oid);
   const std::string get_primary_oid() const;
   const std::string get_secondary_oid() const;
   void swap_primary_secondary_oid();
index 535232100e3100edfe58a511a266f41c40209e00..bd9e021beca43b5914704f664638a9a3c7ad5ef7 100644 (file)
@@ -47,7 +47,8 @@ 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, bool delete_objects)
+                 bool ec_optimizations, std::shared_ptr<ceph::io_exerciser::IoSequence> seq,
+                 bool delete_objects)
     : Model(primary_oid, secondary_oid, block_size, delete_objects),
       rados(rados),
       asio(asio),
@@ -58,7 +59,8 @@ RadosIo::RadosIo(librados::Rados& rados, boost::asio::io_context& asio,
       threads(threads),
       lock(lock),
       cond(cond),
-      outstanding_io(0) {
+      outstanding_io(0),
+      seq(seq) {
   int rc;
   rc = rados.ioctx_create(pool.c_str(), io);
   ceph_assert(rc == 0);
@@ -261,7 +263,9 @@ void RadosIo::applyReadWriteOp(IoOp& op) {
       ceph_assert(ec == boost::system::errc::success);
       for (int i = 0; i < N; i++) {
         ceph_assert(db->validate(op_info->bufferlist[i], op_info->offset[i],
-                                 op_info->length[i], pool, curseq, step));
+                                 op_info->length[i], pool,
+                                 seq ? seq->get_id() : Sequence::SEQUENCE_END,
+                                 seq ? seq->get_step() : -1));
       }
       finish_io();
     };
index d0b539ae3ad9b003e8197ba936c8123d682a10b1..c16187b518499e7b9058d2b07a4035d891752c3f 100644 (file)
@@ -38,6 +38,7 @@ class RadosIo : public Model {
   ceph::condition_variable& cond;
   librados::IoCtx io;
   int outstanding_io;
+  std::shared_ptr<ceph::io_exerciser::IoSequence> seq;
 
   void start_io();
   void finish_io();
@@ -48,7 +49,8 @@ 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 delete_objects = true);
+          bool ec_optimizations, std::shared_ptr<ceph::io_exerciser::IoSequence> seq = nullptr,
+          bool delete_objects = true);
 
   ~RadosIo();
 
index 1c7bc9b68885f7521c70a1daded1747391d8803b..a6dd332ff69d0bde2d55d1bc4e082def2eb3a2ac 100644 (file)
@@ -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(), delete_objects);
+        spo.get_allow_pool_ec_optimizations(), seq, delete_objects);
     dout(0) << "= " << primary_oid << " pool=" << pool << " threads=" << threads
             << " blocksize=" << exerciser_model->get_block_size() << " ="
             << dendl;
@@ -1072,7 +1072,6 @@ ceph::io_sequence::tester::TestObject::TestObject(
   }
 
   op = seq->next();
-  exerciser_model->set_test_step(curseq, seq->get_step());
   done = false;
   dout(0) << "== " << exerciser_model->get_primary_oid() << " " << curseq << " "
           << seq->get_name_with_seqseed() << " ==" << dendl;
@@ -1119,7 +1118,6 @@ bool ceph::io_sequence::tester::TestObject::next() {
       op = seq->next();
     }
   }
-  exerciser_model->set_test_step(curseq, seq->get_step());
   return done;
 }
 
@@ -1208,7 +1206,7 @@ void ceph::io_sequence::tester::TestRunner::list_sequence(bool testrecovery) {
   // List sequences
   std::pair<int, int> obj_size_range = sos.select();
   ceph::io_exerciser::Sequence s = ceph::io_exerciser::Sequence::SEQUENCE_BEGIN;
-  std::unique_ptr<ceph::io_exerciser::IoSequence> seq;
+  std::shared_ptr<ceph::io_exerciser::IoSequence> seq;
   std::optional<std::pair<int, int>> km;
   std::optional<std::pair<std::string_view, std::string_view>> mappinglayers;
   if (testrecovery) {
index a48564f5c6df84296a3cc8432602e07727be8605..0c89ffa571e37d56ea4f442ffe6c438ede57f7fe 100644 (file)
@@ -474,7 +474,7 @@ class TestObject {
   std::pair<ceph::io_exerciser::Sequence, ceph::io_exerciser::Sequence>
       seq_range;
   ceph::io_exerciser::Sequence curseq;
-  std::unique_ptr<ceph::io_exerciser::IoSequence> seq;
+  std::shared_ptr<ceph::io_exerciser::IoSequence> seq;
   std::unique_ptr<ceph::io_exerciser::IoOp> op;
   bool done;
   ceph::util::random_number_generator<int>& rng;