From: Alex Ainscow Date: Tue, 11 Mar 2025 11:03:06 +0000 (+0000) Subject: test: IO sequence exerciser enable ec optimisations X-Git-Tag: v20.3.0~179^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=446df87ca6c1bbba1cb5e9c874dfb4191ab192f2;p=ceph.git test: IO sequence exerciser enable ec optimisations The io sequencer has been written to primarily test the new EC code. This commit turns that flag on by default. It also provides a flag to disable the new optimizations, which we expect to drop in the future. Signed-off-by: Alex Ainscow --- diff --git a/src/common/io_exerciser/RadosIo.cc b/src/common/io_exerciser/RadosIo.cc index cf0cc1163d448..e411ddede4907 100644 --- a/src/common/io_exerciser/RadosIo.cc +++ b/src/common/io_exerciser/RadosIo.cc @@ -41,7 +41,7 @@ RadosIo::RadosIo(librados::Rados& rados, boost::asio::io_context& asio, const std::string& pool, const std::string& oid, const std::optional>& cached_shard_order, uint64_t block_size, int seed, int threads, ceph::mutex& lock, - ceph::condition_variable& cond) + ceph::condition_variable& cond, bool ec_optimizations) : Model(oid, block_size), rados(rados), asio(asio), @@ -58,6 +58,9 @@ RadosIo::RadosIo(librados::Rados& rados, boost::asio::io_context& asio, rc = rados.ioctx_create(pool.c_str(), io); ceph_assert(rc == 0); allow_ec_overwrites(true); + if (ec_optimizations) { + allow_ec_optimizations(); + } } RadosIo::~RadosIo() {} @@ -92,6 +95,17 @@ void RadosIo::allow_ec_overwrites(bool allow) { ceph_assert(rc == 0); } +void RadosIo::allow_ec_optimizations() +{ + int rc; + bufferlist inbl, outbl; + std::string cmdstr = + "{\"prefix\": \"osd pool set\", \"pool\": \"" + pool + "\", \ + \"var\": \"allow_ec_optimizations\", \"val\": \"true\"}"; + rc = rados.mon_command(cmdstr, inbl, &outbl, nullptr); + ceph_assert(rc == 0); +} + template RadosIo::AsyncOpInfo::AsyncOpInfo(const std::array& offset, const std::array& length) diff --git a/src/common/io_exerciser/RadosIo.h b/src/common/io_exerciser/RadosIo.h index d72c941cdf415..1837b75725ae0 100644 --- a/src/common/io_exerciser/RadosIo.h +++ b/src/common/io_exerciser/RadosIo.h @@ -42,11 +42,12 @@ class RadosIo : public Model { const std::string& pool, const std::string& oid, const std::optional>& cached_shard_order, uint64_t block_size, int seed, int threads, ceph::mutex& lock, - ceph::condition_variable& cond); + ceph::condition_variable& cond, bool ec_optimizations); ~RadosIo(); void allow_ec_overwrites(bool allow); + void allow_ec_optimizations(); template class AsyncOpInfo { 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 77049721af84d..03949ff3c48e4 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 @@ -2,7 +2,6 @@ #include #include -#include #include #include "common/Formatter.h" @@ -11,6 +10,11 @@ #include "common/ceph_json.h" #include "common/debug.h" #include "common/dout.h" +#include "common/split.h" +#include "common/strtol.h" // for strict_iecstrtoll() +#include "common/ceph_json.h" +#include "common/Formatter.h" + #include "common/io_exerciser/DataGenerator.h" #include "common/io_exerciser/EcIoSequence.h" #include "common/io_exerciser/IoOp.h" @@ -21,9 +25,6 @@ #include "common/json/BalancerStructures.h" #include "common/json/ConfigStructures.h" #include "common/json/OSDStructures.h" -#include "common/split.h" -#include "common/strtol.h" // for strict_iecstrtoll() -#include "erasure-code/ErasureCodePlugin.h" #include "fmt/format.h" #include "global/global_context.h" #include "global/global_init.h" @@ -763,7 +764,8 @@ ceph::io_sequence::tester::SelectErasurePool::SelectErasurePool( bool allow_pool_balancer, bool allow_pool_deep_scrubbing, bool allow_pool_scrubbing, - bool test_recovery) + bool test_recovery, + bool disable_pool_ec_optimizations) : ProgramOptionReader(vm, "pool"), rados(rados), dry_run(dry_run), @@ -772,6 +774,7 @@ ceph::io_sequence::tester::SelectErasurePool::SelectErasurePool( allow_pool_deep_scrubbing(allow_pool_deep_scrubbing), allow_pool_scrubbing(allow_pool_scrubbing), test_recovery(test_recovery), + disable_pool_ec_optimizations(disable_pool_ec_optimizations), first_use(true), sep{cct, rng, vm, rados, dry_run, first_use} { if (isForced()) { @@ -834,7 +837,8 @@ std::string ceph::io_sequence::tester::SelectErasurePool::create() { std::string pool_name; profile = sep.select(); - pool_name = fmt::format("testpool-pr{}", profile->name); + pool_name = fmt::format("testpool-pr{}{}", profile->name, + disable_pool_ec_optimizations?"_no_ec_opt":""); ceph::messaging::osd::OSDECPoolCreateRequest pool_create_request{ pool_name, "erasure", 8, 8, profile->name}; @@ -962,7 +966,7 @@ ceph::io_sequence::tester::TestObject::TestObject( exerciser_model = std::make_unique( rados, asio, pool, oid, cached_shard_order, sbs.select(), rng(), - threads, lock, cond); + threads, lock, cond, spo.get_allow_pool_ec_optimizations()); dout(0) << "= " << oid << " pool=" << pool << " threads=" << threads << " blocksize=" << exerciser_model->get_block_size() << " =" << dendl; @@ -1054,7 +1058,8 @@ ceph::io_sequence::tester::TestRunner::TestRunner( vm.contains("allow_pool_balancer"), vm.contains("allow_pool_deep_scrubbing"), vm.contains("allow_pool_scrubbing"), - vm.contains("test_recovery")}, + vm.contains("test_recovery"), + vm.contains("disable_pool_ec_optimizations")}, snt{rng, vm, "threads", true}, ssr{vm} { dout(0) << "Test using seed " << seed << dendl; @@ -1075,6 +1080,7 @@ ceph::io_sequence::tester::TestRunner::TestRunner( allow_pool_balancer = vm.contains("allow_pool_balancer"); allow_pool_deep_scrubbing = vm.contains("allow_pool_deep_scrubbing"); allow_pool_scrubbing = vm.contains("allow_pool_scrubbing"); + disable_pool_ec_optimizations = vm.contains("disable_pool_ec_optimizations"); if (!dryrun) { guard.emplace(boost::asio::make_work_guard(asio)); @@ -1229,7 +1235,8 @@ bool ceph::io_sequence::tester::TestRunner::run_interactive_test() { model = std::make_unique( rados, asio, pool, object_name, osd_map_reply.acting, sbs.select(), rng(), 1, // 1 thread - lock, cond); + lock, cond, + spo.get_allow_pool_ec_optimizations()); } while (!done) { 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 eeb3abb6cedd1..16fe6d7b778d1 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 @@ -388,7 +388,8 @@ class SelectErasurePool : public ProgramOptionReader { bool allow_pool_balancer, bool allow_pool_deep_scrubbing, bool allow_pool_scrubbing, - bool test_recovery); + bool test_recovery, + bool disable_pool_ec_optimizations); const std::string select() override; std::string create(); void configureServices(bool allow_pool_autoscaling, @@ -403,7 +404,9 @@ class SelectErasurePool : public ProgramOptionReader { return allow_pool_deep_scrubbing; } inline bool get_allow_pool_scrubbing() { return allow_pool_scrubbing; } - + inline bool get_allow_pool_ec_optimizations() { + return !disable_pool_ec_optimizations; + } inline std::optional getProfile() { return profile; } private: @@ -415,6 +418,7 @@ class SelectErasurePool : public ProgramOptionReader { bool allow_pool_deep_scrubbing; bool allow_pool_scrubbing; bool test_recovery; + bool disable_pool_ec_optimizations; bool first_use; @@ -505,6 +509,7 @@ class TestRunner { bool allow_pool_balancer; bool allow_pool_deep_scrubbing; bool allow_pool_scrubbing; + bool disable_pool_ec_optimizations; bool show_sequence; bool show_help;