From: Matty Williams Date: Mon, 5 Jan 2026 17:19:50 +0000 (+0000) Subject: io_exerciser: Use shared pointer to IoSequence object to avoid updating the Sequence... X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F65939%2Fhead;p=ceph.git io_exerciser: Use shared pointer to IoSequence object to avoid updating the Sequence and step for every iteration https://tracker.ceph.com/issues/73534 Signed-off-by: Matty Williams --- diff --git a/src/common/io_exerciser/DataGenerator.cc b/src/common/io_exerciser/DataGenerator.cc index f337a76d4869..292a4222f037 100644 --- a/src/common/io_exerciser/DataGenerator.cc +++ b/src/common/io_exerciser/DataGenerator.cc @@ -8,7 +8,6 @@ #include #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 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); } diff --git a/src/common/io_exerciser/DataGenerator.h b/src/common/io_exerciser/DataGenerator.h index 9a8bae7e2cca..314134386399 100644 --- a/src/common/io_exerciser/DataGenerator.h +++ b/src/common/io_exerciser/DataGenerator.h @@ -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; diff --git a/src/common/io_exerciser/Model.cc b/src/common/io_exerciser/Model.cc index d8a51f52e955..dfa113d8c342 100644 --- a/src/common/io_exerciser/Model.cc +++ b/src/common/io_exerciser/Model.cc @@ -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; -} diff --git a/src/common/io_exerciser/Model.h b/src/common/io_exerciser/Model.h index 173c61fb8bce..1415ebd8fbc2 100644 --- a/src/common/io_exerciser/Model.h +++ b/src/common/io_exerciser/Model.h @@ -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(); diff --git a/src/common/io_exerciser/RadosIo.cc b/src/common/io_exerciser/RadosIo.cc index 535232100e31..bd9e021beca4 100644 --- a/src/common/io_exerciser/RadosIo.cc +++ b/src/common/io_exerciser/RadosIo.cc @@ -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 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(); }; diff --git a/src/common/io_exerciser/RadosIo.h b/src/common/io_exerciser/RadosIo.h index d0b539ae3ad9..c16187b51849 100644 --- a/src/common/io_exerciser/RadosIo.h +++ b/src/common/io_exerciser/RadosIo.h @@ -38,6 +38,7 @@ class RadosIo : public Model { ceph::condition_variable& cond; librados::IoCtx io; int outstanding_io; + std::shared_ptr 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 seq = nullptr, + bool delete_objects = true); ~RadosIo(); diff --git a/src/test/osd/ceph_test_rados_io_sequence/ceph_test_rados_io_sequence.cc b/src/test/osd/ceph_test_rados_io_sequence/ceph_test_rados_io_sequence.cc index 1c7bc9b68885..a6dd332ff69d 100644 --- a/src/test/osd/ceph_test_rados_io_sequence/ceph_test_rados_io_sequence.cc +++ b/src/test/osd/ceph_test_rados_io_sequence/ceph_test_rados_io_sequence.cc @@ -1053,7 +1053,7 @@ ceph::io_sequence::tester::TestObject::TestObject( exerciser_model = std::make_unique( 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 obj_size_range = sos.select(); ceph::io_exerciser::Sequence s = ceph::io_exerciser::Sequence::SEQUENCE_BEGIN; - std::unique_ptr seq; + std::shared_ptr seq; std::optional> km; std::optional> mappinglayers; if (testrecovery) { diff --git a/src/test/osd/ceph_test_rados_io_sequence/ceph_test_rados_io_sequence.h b/src/test/osd/ceph_test_rados_io_sequence/ceph_test_rados_io_sequence.h index a48564f5c6df..0c89ffa571e3 100644 --- a/src/test/osd/ceph_test_rados_io_sequence/ceph_test_rados_io_sequence.h +++ b/src/test/osd/ceph_test_rados_io_sequence/ceph_test_rados_io_sequence.h @@ -474,7 +474,7 @@ class TestObject { std::pair seq_range; ceph::io_exerciser::Sequence curseq; - std::unique_ptr seq; + std::shared_ptr seq; std::unique_ptr op; bool done; ceph::util::random_number_generator& rng;