From: Matty Williams Date: Tue, 14 Oct 2025 15:27:58 +0000 (+0100) Subject: io_exerciser: Fix bugs from previous commit X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ff040c1b5f967be4e729f69b9a2f895a9329cfe0;p=ceph.git io_exerciser: Fix bugs from previous commit Current test and test step are now updated when the step changes. Fixes: 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 53e5ada06838..f337a76d4869 100644 --- a/src/common/io_exerciser/DataGenerator.cc +++ b/src/common/io_exerciser/DataGenerator.cc @@ -52,8 +52,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, - std::unique_ptr seq) { + ceph::io_exerciser::Sequence curseq, int step) { return bufferlist.contents_equal(generate_data(offset, length)); } @@ -218,7 +217,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, - std::unique_ptr seq) { + int step) { std::vector invalid_block_offsets; for (uint64_t block_offset = offset; block_offset < offset + length; @@ -232,9 +231,9 @@ bool HeaderedSeededRandomGenerator::validate(bufferlist& bufferlist, uint64_t of } if (!invalid_block_offsets.empty()) { - dout(0) << "Miscompare for read of " << m_model.get_primary_oid() << - " offset=" << offset << " length=" << length << " in pool " << pool << - ". This occured in test " << curseq << " step " << seq->get_step() << dendl; + 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; printDebugInformationForOffsets(offset, invalid_block_offsets, bufferlist); } diff --git a/src/common/io_exerciser/DataGenerator.h b/src/common/io_exerciser/DataGenerator.h index 59f073dc5706..9a8bae7e2cca 100644 --- a/src/common/io_exerciser/DataGenerator.h +++ b/src/common/io_exerciser/DataGenerator.h @@ -48,8 +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, - std::unique_ptr seq); + ceph::io_exerciser::Sequence curseq, int step); // Used for testing debug outputs from data generation virtual bufferlist generate_wrong_data(uint64_t offset, uint64_t length); @@ -82,8 +81,8 @@ class HeaderedSeededRandomGenerator : public SeededRandomGenerator { bufferptr generate_block(uint64_t offset) override; 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, - std::unique_ptr seq) override; + uint64_t length, std::string_view pool, + ceph::io_exerciser::Sequence curseq, 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 dfa113d8c342..d8a51f52e955 100644 --- a/src/common/io_exerciser/Model.cc +++ b/src/common/io_exerciser/Model.cc @@ -33,3 +33,8 @@ 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 23ff35b3603b..173c61fb8bce 100644 --- a/src/common/io_exerciser/Model.h +++ b/src/common/io_exerciser/Model.h @@ -6,6 +6,7 @@ #include #include "IoOp.h" +#include "common/io_exerciser/IoSequence.h" #include "common/Thread.h" #include "global/global_context.h" #include "global/global_init.h" @@ -33,9 +34,14 @@ 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}; + void set_primary_oid(const std::string& new_oid); + void set_secondary_oid(const std::string& new_oid); + public: Model(const std::string& primary_oid, const std::string& secondary_oid, uint64_t block_size, bool delete_objects); @@ -43,6 +49,7 @@ 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); diff --git a/src/common/io_exerciser/RadosIo.cc b/src/common/io_exerciser/RadosIo.cc index c39ff421dee0..535232100e31 100644 --- a/src/common/io_exerciser/RadosIo.cc +++ b/src/common/io_exerciser/RadosIo.cc @@ -47,8 +47,7 @@ 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, ceph::io_exerciser::Sequence curseq, - std::unique_ptr seq, bool delete_objects) + bool ec_optimizations, bool delete_objects) : Model(primary_oid, secondary_oid, block_size, delete_objects), rados(rados), asio(asio), @@ -59,9 +58,7 @@ RadosIo::RadosIo(librados::Rados& rados, boost::asio::io_context& asio, threads(threads), lock(lock), cond(cond), - outstanding_io(0), - curseq(curseq), - seq(seq) { + outstanding_io(0) { int rc; rc = rados.ioctx_create(pool.c_str(), io); ceph_assert(rc == 0); @@ -264,7 +261,7 @@ 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, seq)); + op_info->length[i], pool, curseq, step)); } finish_io(); }; diff --git a/src/common/io_exerciser/RadosIo.h b/src/common/io_exerciser/RadosIo.h index 2f19f7a8d887..d0b539ae3ad9 100644 --- a/src/common/io_exerciser/RadosIo.h +++ b/src/common/io_exerciser/RadosIo.h @@ -38,8 +38,6 @@ class RadosIo : public Model { ceph::condition_variable& cond; librados::IoCtx io; int outstanding_io; - ceph::io_exerciser::Sequence curseq; - std::unique_ptr seq; void start_io(); void finish_io(); @@ -50,8 +48,7 @@ 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, ceph::io_exerciser::Sequence curseq, - std::unique_ptr seq, bool delete_objects = true); + bool ec_optimizations, 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 709f6e5e6932..1c7bc9b68885 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 @@ -1072,6 +1072,7 @@ 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; @@ -1118,6 +1119,7 @@ bool ceph::io_sequence::tester::TestObject::next() { op = seq->next(); } } + exerciser_model->set_test_step(curseq, seq->get_step()); return done; }