From: Matty Williams Date: Mon, 5 Jan 2026 15:47:26 +0000 (+0000) Subject: io_exerciser: Handle the Remove case inside of the exerciser_model->applyIoOp method... X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1a9d3d65898d9b9a910d85d3a0faaa3cc0c254dd;p=ceph.git io_exerciser: Handle the Remove case inside of the exerciser_model->applyIoOp method call instead of using a wrapper around this call. Fixes: https://tracker.ceph.com/issues/73520 Signed-off-by: Matty Williams --- diff --git a/src/common/io_exerciser/Model.cc b/src/common/io_exerciser/Model.cc index e0dc9b0b4ce..dfa113d8c34 100644 --- a/src/common/io_exerciser/Model.cc +++ b/src/common/io_exerciser/Model.cc @@ -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; } diff --git a/src/common/io_exerciser/Model.h b/src/common/io_exerciser/Model.h index 9db80df1dd7..23ff35b3603 100644 --- a/src/common/io_exerciser/Model.h +++ b/src/common/io_exerciser/Model.h @@ -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; diff --git a/src/common/io_exerciser/ObjectModel.cc b/src/common/io_exerciser/ObjectModel.cc index 17b02560144..7f155d12220 100644 --- a/src/common/io_exerciser/ObjectModel.cc +++ b/src/common/io_exerciser/ObjectModel.cc @@ -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(op); diff --git a/src/common/io_exerciser/ObjectModel.h b/src/common/io_exerciser/ObjectModel.h index 8e6a54dfcd4..e16658085b6 100644 --- a/src/common/io_exerciser/ObjectModel.h +++ b/src/common/io_exerciser/ObjectModel.h @@ -45,10 +45,8 @@ class ObjectModel : public Model { interval_set 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 get_seed_offsets(int seed) const; diff --git a/src/common/io_exerciser/RadosIo.cc b/src/common/io_exerciser/RadosIo.cc index 91fbb08ac9d..24be675c184 100644 --- a/src/common/io_exerciser/RadosIo.cc +++ b/src/common/io_exerciser/RadosIo.cc @@ -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(primary_oid, secondary_oid, block_size, seed)), + om(std::make_unique(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>(); librados::ObjectWriteOperation wop; diff --git a/src/common/io_exerciser/RadosIo.h b/src/common/io_exerciser/RadosIo.h index ceb524387c0..f44216d138b 100644 --- a/src/common/io_exerciser/RadosIo.h +++ b/src/common/io_exerciser/RadosIo.h @@ -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(); 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 4a424186557..709f6e5e693 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 @@ -1026,12 +1026,12 @@ ceph::io_sequence::tester::TestObject::TestObject( SelectObjectSize& sos, SelectNumThreads& snt, SelectSeqRange& ssr, ceph::util::random_number_generator& rng, ceph::mutex& lock, ceph::condition_variable& cond, bool dryrun, bool verbose, - std::optional 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 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( - 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( 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( 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; 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 34d82becd1c..a48564f5c6d 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 @@ -461,7 +461,7 @@ class TestObject { std::optional 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 seqseed; bool interactive;