From 266d03fca0925532e384b10ca99fbd34ecf72af1 Mon Sep 17 00:00:00 2001 From: Connor Fawcett Date: Fri, 25 Apr 2025 11:30:58 +0100 Subject: [PATCH] common/io_exerciser: Fix the --sequence and --listsequence options for the IO exerciser. Also fix an incorrect read operation in SEQ7. Signed-off-by: Connor Fawcett Fixes: https://tracker.ceph.com/issues/71074 --- src/common/io_exerciser/IoSequence.cc | 2 +- .../ceph_test_rados_io_sequence.cc | 52 +++++++++++++------ 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/common/io_exerciser/IoSequence.cc b/src/common/io_exerciser/IoSequence.cc index 2f00f13e6147b..97289238fe6b7 100644 --- a/src/common/io_exerciser/IoSequence.cc +++ b/src/common/io_exerciser/IoSequence.cc @@ -459,7 +459,7 @@ std::unique_ptr ceph::io_exerciser::Seq7::_next() { } doneread = false; donebarrier = false; - return DoubleReadOp::generate(offset, 1, obj_size / 2, 1); + return DoubleWriteOp::generate(offset, 1, obj_size / 2, 1); } ceph::io_exerciser::Seq8::Seq8(std::pair obj_size_range, int seed) 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 03949ff3c48e4..e15635612555f 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 @@ -84,6 +84,22 @@ void validate(boost::any& v, const std::vector& values, v = boost::any(std::pair{first, second}); } +struct SequencePair {}; +void validate(boost::any& v, const std::vector& values, + SequencePair* target_type, int) { + po::validators::check_first_occurrence(v); + const std::string& s = po::validators::get_single_string(values); + auto part = ceph::split(s).begin(); + std::string parse_error; + int first = strict_iecstrtoll(*part++, &parse_error); + int second = strict_iecstrtoll(*part, &parse_error); + if (!parse_error.empty()) { + throw po::validation_error(po::validation_error::invalid_option_value); + } + v = boost::any(std::make_pair(static_cast(first), + static_cast(second))); +} + struct PluginString {}; void validate(boost::any& v, const std::vector& values, PluginString* target_type, int) { @@ -155,7 +171,7 @@ po::options_description get_options_description() { "show list of sequences")( "dryrun,d", "test sequence, do not issue any I/O")( "verbose", "more verbose output during test")( - "sequence,s", po::value(), "test specified sequence")( + "sequence,s", po::value(), "test specified sequence range")( "seed", po::value(), "seed for whole test")( "seqseed", po::value(), "seed for sequence")( "blocksize,b", po::value(), "block size (default 2048)")( @@ -246,17 +262,16 @@ ceph::io_sequence::tester::SelectSeqRange::SelectSeqRange(po::variables_map& vm) ceph::io_exerciser::Sequence>>(vm, "sequence") { if (vm.count(option_name)) { - ceph::io_exerciser::Sequence s = - static_cast(vm["sequence"].as()); - if (s < ceph::io_exerciser::Sequence::SEQUENCE_BEGIN || - s >= ceph::io_exerciser::Sequence::SEQUENCE_END) { + using SeqPair = std::pair; + SeqPair s = vm["sequence"].as(); + if (s.first < ceph::io_exerciser::Sequence::SEQUENCE_BEGIN || + s.second >= ceph::io_exerciser::Sequence::SEQUENCE_END || + s.first > s.second) { dout(0) << "Sequence argument out of range" << dendl; throw po::validation_error(po::validation_error::invalid_option_value); } - ceph::io_exerciser::Sequence e = s; - force_value = std::make_optional< - std::pair>( - std::make_pair(s, ++e)); + ++s.second; + force_value = s; } } @@ -1112,27 +1127,32 @@ void ceph::io_sequence::tester::TestRunner::list_sequence(bool testrecovery) { std::pair obj_size_range = sos.select(); ceph::io_exerciser::Sequence s = ceph::io_exerciser::Sequence::SEQUENCE_BEGIN; std::unique_ptr seq; + std::optional> km; + std::optional> mappinglayers; if (testrecovery) { std::optional profile = spo.getProfile(); - std::optional> km; - std::optional> mappinglayers; if (profile) { km = profile->km; if (profile->mapping && profile->layers) { mappinglayers = {*spo.getProfile()->mapping, *spo.getProfile()->layers}; } } - seq = ceph::io_exerciser::EcIoSequence::generate_sequence( - s, obj_size_range, km, mappinglayers, seqseed.value_or(rng())); - } else { - seq = ceph::io_exerciser::IoSequence::generate_sequence( - s, obj_size_range, seqseed.value_or(rng())); } do { + if (testrecovery) { + seq = ceph::io_exerciser::EcIoSequence::generate_sequence( + s, obj_size_range, km, mappinglayers, seqseed.value_or(rng())); + } + else { + seq = ceph::io_exerciser::IoSequence::generate_sequence( + s, obj_size_range, seqseed.value_or(rng())); + } + dout(0) << s << " " << seq->get_name_with_seqseed() << dendl; s = seq->getNextSupportedSequenceId(); + } while (s != ceph::io_exerciser::Sequence::SEQUENCE_END); } -- 2.39.5