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; }
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;
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];
}
} 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<SingleReadOp&>(op);
interval_set<uint64_t> 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<int> get_seed_offsets(int seed) const;
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<ObjectModel>(primary_oid, secondary_oid, block_size, seed)),
+ 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)),
pool(pool),
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++;
}
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<AsyncOpInfo<0>>();
librados::ObjectWriteOperation wop;
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();
SelectObjectSize& sos, SelectNumThreads& snt, SelectSeqRange& ssr,
ceph::util::random_number_generator<int>& rng, ceph::mutex& lock,
ceph::condition_variable& cond, bool dryrun, bool verbose,
- std::optional<int> 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<int> 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<ceph::io_exerciser::ObjectModel>(
- 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) {
exerciser_model = std::make_unique<ceph::io_exerciser::RadosIo>(
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;
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,
<< ": " << 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) {
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")) {
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, dont_delete_objects));
+ dryrun, verbose, seqseed, testrecovery, checkconsistency, delete_objects));
}
catch (const std::runtime_error &e) {
std::cerr << "Error: " << e.what() << std::endl;
std::optional<int> seqseed,
bool testRecovery,
bool checkConsistency,
- bool dontDeleteObjects);
+ bool delete_objects);
int get_num_io();
bool readyForIo();
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 {
bool verbose;
bool dryrun;
- bool dont_delete_objects;
+ bool delete_objects;
std::optional<int> seqseed;
bool interactive;