using RadosIo = ceph::io_exerciser::RadosIo;
using ConsistencyChecker = ceph::consistency::ConsistencyChecker;
+using GenerationType = ceph::io_exerciser::data_generation::GenerationType;
+
namespace {
template <typename S>
int send_osd_command(int osd, S& s, librados::Rados& rados, const char* name,
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, std::shared_ptr<ceph::io_exerciser::IoSequence> seq,
- bool delete_objects)
+ bool ec_optimizations, GenerationType data_generation_type,
+ std::shared_ptr<ceph::io_exerciser::IoSequence> seq, bool delete_objects)
: Model(primary_oid, secondary_oid, block_size, delete_objects),
rados(rados),
asio(asio),
om(std::make_unique<ObjectModel>(primary_oid, secondary_oid, block_size, seed, delete_objects)),
db(data_generation::DataGenerator::create_generator(
- data_generation::GenerationType::HeaderedSeededRandom, *om)),
+ data_generation_type, *om)),
pool(pool),
threads(threads),
lock(lock),
using DoubleFailedWriteOp = ceph::io_exerciser::DoubleFailedWriteOp;
using TripleFailedWriteOp = ceph::io_exerciser::TripleFailedWriteOp;
+using GenerationType = ceph::io_exerciser::data_generation::GenerationType;
+
namespace {
struct Size {};
void validate(boost::any& v, const std::vector<std::string>& values,
" may be removed. at a later date. Disabled by default if ec optimized")(
"dont_delete_objects",
"Stops the IO exerciser from deleting the object it was running the test "
- "against once the test finishes. Does not affect interactive mode");
+ "against once the test finishes. Does not affect interactive mode")(
+ "data_generation_type", po::value<std::string>(),
+ "Data generation type to use for write IOs. Default is HeaderedSeededRandom");
return desc;
}
+GenerationType parse_data_generation_type(po::variables_map& vm) {
+ if (!vm.contains("data_generation_type")) {
+ // Default value
+ return GenerationType::HeaderedSeededRandom;
+ }
+
+ std::string data_generation_type = vm["data_generation_type"].as<std::string>();
+ if (data_generation_type == "HeaderedSeededRandom") {
+ return GenerationType::HeaderedSeededRandom;
+ } else if (data_generation_type == "SeededRandom") {
+ return GenerationType::SeededRandom;
+ } else {
+ throw std::invalid_argument(
+ fmt::format("Unrecognised data generation type: {}", data_generation_type));
+ }
+}
+
int parse_io_seq_options(po::variables_map& vm, int argc, char** argv) {
std::vector<std::string> unrecognized_options;
try {
SelectObjectSize& sos, SelectNumThreads& snt, SelectSeqRange& ssr,
std::mt19937_64& rng, ceph::mutex& lock,
ceph::condition_variable& cond, bool dryrun, bool verbose,
- std::optional<int> seqseed, bool testrecovery, bool checkconsistency, bool delete_objects)
- : rng(rng), verbose(verbose), seqseed(seqseed), testrecovery(testrecovery), checkconsistency(checkconsistency),
- delete_objects(delete_objects) {
+ std::optional<int> seqseed, bool testrecovery, bool checkconsistency,
+ bool delete_objects, GenerationType data_generation_type)
+ : rng(rng), verbose(verbose), seqseed(seqseed), testrecovery(testrecovery),
+ checkconsistency(checkconsistency), delete_objects(delete_objects),
+ data_generation_type(data_generation_type) {
if (dryrun) {
int model_seed = rng();
exerciser_model = std::make_unique<ceph::io_exerciser::ObjectModel>(
exerciser_model = std::make_unique<ceph::io_exerciser::RadosIo>(
rados, asio, pool, primary_oid, secondary_oid, sbs.select(), model_seed,
threads, lock, cond, spo.is_replicated_pool(),
- spo.get_allow_pool_ec_optimizations(), seq, delete_objects);
+ spo.get_allow_pool_ec_optimizations(), data_generation_type, seq, delete_objects);
dout(0) << "= " << primary_oid << " pool=" << pool << " threads=" << threads
<< " blocksize=" << exerciser_model->get_block_size() << " ="
<< dendl;
dryrun = vm.contains("dryrun");
delete_objects = !vm.contains("dont_delete_objects");
+ data_generation_type = parse_data_generation_type(vm);
+
seqseed = std::nullopt;
if (vm.contains("seqseed")) {
seqseed = vm["seqseed"].as<int>();
rados, asio, pool, primary_object_name, secondary_object_name, sbs.select(), model_seed,
1, // 1 thread
lock, cond, spo.is_replicated_pool(),
- spo.get_allow_pool_ec_optimizations());
+ spo.get_allow_pool_ec_optimizations(),
+ data_generation_type);
}
while (!done) {
test_objects.push_back(
std::make_shared<ceph::io_sequence::tester::TestObject>(
primary_name, secondary_name, rados, asio, sbs, spo, sos, snt, ssr, rng, lock, cond,
- dryrun, verbose, seqseed, testrecovery, checkconsistency, delete_objects));
+ dryrun, verbose, seqseed, testrecovery, checkconsistency,
+ delete_objects, data_generation_type));
}
catch (const std::runtime_error &e) {
std::cerr << "Error: " << e.what() << std::endl;