Skip to content

Commit 302756c

Browse files
authored
Merge pull request ceph#61771 from aainscow/new_io_sequencer_sequences
test: Add new sequences to the IO sequencer.
2 parents e7e33a6 + 1adfe92 commit 302756c

File tree

12 files changed

+423
-37
lines changed

12 files changed

+423
-37
lines changed

src/common/io_exerciser/DataGenerator.cc

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -56,28 +56,32 @@ bool DataGenerator::validate(bufferlist& bufferlist, uint64_t offset,
5656
ceph::bufferptr SeededRandomGenerator::generate_block(uint64_t block_offset) {
5757
uint64_t block_size = m_model.get_block_size();
5858
char buffer[block_size];
59+
SeedBytes seed = m_model.get_seed(block_offset);
60+
if (seed != 0) {
61+
std::mt19937_64 random_generator(seed);
62+
uint64_t rand1 = random_generator();
63+
uint64_t rand2 = random_generator();
5964

60-
std::mt19937_64 random_generator(m_model.get_seed(block_offset));
61-
uint64_t rand1 = random_generator();
62-
uint64_t rand2 = random_generator();
63-
64-
constexpr size_t generation_length = sizeof(uint64_t);
65+
constexpr size_t generation_length = sizeof(uint64_t);
6566

66-
for (uint64_t i = 0; i < block_size;
67-
i += (2 * generation_length), rand1++, rand2--) {
68-
std::memcpy(buffer + i, &rand1, generation_length);
69-
std::memcpy(buffer + i + generation_length, &rand2, generation_length);
70-
}
67+
for (uint64_t i = 0; i < block_size;
68+
i += (2 * generation_length), rand1++, rand2--) {
69+
std::memcpy(buffer + i, &rand1, generation_length);
70+
std::memcpy(buffer + i + generation_length, &rand2, generation_length);
71+
}
7172

72-
size_t remainingBytes = block_size % (generation_length * 2);
73-
if (remainingBytes > generation_length) {
74-
size_t remainingBytes2 = remainingBytes - generation_length;
75-
std::memcpy(buffer + block_size - remainingBytes, &rand1, remainingBytes);
76-
std::memcpy(buffer + block_size - remainingBytes2, &rand2, remainingBytes2);
77-
} else if (remainingBytes > 0) {
78-
std::memcpy(buffer + block_size - remainingBytes, &rand1, remainingBytes);
73+
size_t remainingBytes = block_size % (generation_length * 2);
74+
if (remainingBytes > generation_length) {
75+
size_t remainingBytes2 = remainingBytes - generation_length;
76+
std::memcpy(buffer + block_size - remainingBytes, &rand1, remainingBytes);
77+
std::memcpy(buffer + block_size - remainingBytes2, &rand2,
78+
remainingBytes2);
79+
} else if (remainingBytes > 0) {
80+
std::memcpy(buffer + block_size - remainingBytes, &rand1, remainingBytes);
81+
}
82+
} else {
83+
std::memset(buffer, 0, block_size);
7984
}
80-
8185
return ceph::bufferptr(buffer, block_size);
8286
}
8387

@@ -159,10 +163,12 @@ ceph::bufferptr HeaderedSeededRandomGenerator::generate_block(
159163
ceph::bufferptr bufferptr =
160164
SeededRandomGenerator::generate_block(block_offset);
161165

162-
std::memcpy(bufferptr.c_str() + uniqueIdStart(), &unique_run_id,
163-
uniqueIdLength());
164-
std::memcpy(bufferptr.c_str() + seedStart(), &seed, seedLength());
165-
std::memcpy(bufferptr.c_str() + timeStart(), &current_time, timeLength());
166+
if (seed != 0) {
167+
std::memcpy(bufferptr.c_str() + uniqueIdStart(), &unique_run_id,
168+
uniqueIdLength());
169+
std::memcpy(bufferptr.c_str() + seedStart(), &seed, seedLength());
170+
std::memcpy(bufferptr.c_str() + timeStart(), &current_time, timeLength());
171+
}
166172

167173
return bufferptr;
168174
}
@@ -650,4 +656,4 @@ void HeaderedSeededRandomGenerator ::printDebugInformationForOffsets(
650656
printDebugInformationForRange(read_offset, range_start, range_length,
651657
rangeError, bufferlist);
652658
}
653-
}
659+
}

src/common/io_exerciser/DataGenerator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ class DataGenerator {
5151
// Used for testing debug outputs from data generation
5252
virtual bufferlist generate_wrong_data(uint64_t offset, uint64_t length);
5353

54+
using SeedBytes = int;
55+
5456
protected:
5557
const ObjectModel& m_model;
5658

src/common/io_exerciser/EcIoSequence.cc

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@ std::unique_ptr<IoSequence> EcIoSequence::generate_sequence(
3333
case Sequence::SEQUENCE_SEQ8:
3434
[[fallthrough]];
3535
case Sequence::SEQUENCE_SEQ9:
36+
[[fallthrough]];
37+
case Sequence::SEQUENCE_SEQ11:
38+
[[fallthrough]];
39+
case Sequence::SEQUENCE_SEQ12:
40+
[[fallthrough]];
41+
case Sequence::SEQUENCE_SEQ13:
42+
[[fallthrough]];
43+
case Sequence::SEQUENCE_SEQ14:
3644
return std::make_unique<ReadInjectSequence>(obj_size_range, seed,
3745
sequence, k, m);
3846
case Sequence::SEQUENCE_SEQ10:
@@ -264,4 +272,4 @@ std::unique_ptr<ceph::io_exerciser::IoOp> ceph::io_exerciser::Seq10::_next() {
264272
ceph_abort_msg("Sequence in undefined state. Aborting");
265273
return DoneOp::generate();
266274
}
267-
}
275+
}

src/common/io_exerciser/IoOp.cc

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ using TripleWriteOp = ceph::io_exerciser::TripleWriteOp;
1919
using SingleFailedWriteOp = ceph::io_exerciser::SingleFailedWriteOp;
2020
using DoubleFailedWriteOp = ceph::io_exerciser::DoubleFailedWriteOp;
2121
using TripleFailedWriteOp = ceph::io_exerciser::TripleFailedWriteOp;
22+
using SingleAppendOp = ceph::io_exerciser::SingleAppendOp;
23+
using TruncateOp = ceph::io_exerciser::TruncateOp;
2224

2325
namespace {
2426
std::string value_to_string(uint64_t v) {
@@ -100,16 +102,21 @@ template <OpType opType, int numIOs>
100102
std::string ceph::io_exerciser::ReadWriteOp<opType, numIOs>::to_string(
101103
uint64_t block_size) const {
102104
std::string offset_length_desc;
105+
std::string length_desc;
103106
if (numIOs > 0) {
104107
offset_length_desc += fmt::format(
105108
"offset1={}", value_to_string(this->offset[0] * block_size));
106-
offset_length_desc += fmt::format(
107-
",length1={}", value_to_string(this->length[0] * block_size));
109+
length_desc += fmt::format("length1={}",
110+
value_to_string(this->length[0] * block_size));
111+
offset_length_desc += "," + length_desc;
108112
for (int i = 1; i < numIOs; i++) {
113+
std::string length;
109114
offset_length_desc += fmt::format(
110115
",offset{}={}", i + 1, value_to_string(this->offset[i] * block_size));
111-
offset_length_desc += fmt::format(
112-
",length{}={}", i + 1, value_to_string(this->length[i] * block_size));
116+
length += fmt::format(",length{}={}", i + 1,
117+
value_to_string(this->length[i] * block_size));
118+
length_desc += length;
119+
offset_length_desc += length;
113120
}
114121
}
115122
switch (opType) {
@@ -125,6 +132,8 @@ std::string ceph::io_exerciser::ReadWriteOp<opType, numIOs>::to_string(
125132
[[fallthrough]];
126133
case OpType::Write3:
127134
return fmt::format("Write{} ({})", numIOs, offset_length_desc);
135+
case OpType::Append:
136+
return fmt::format("Append{} ({})", numIOs, length_desc);
128137
case OpType::FailedWrite:
129138
[[fallthrough]];
130139
case OpType::FailedWrite2:
@@ -200,6 +209,24 @@ std::unique_ptr<TripleWriteOp> TripleWriteOp::generate(
200209
offset3, length3);
201210
}
202211

212+
SingleAppendOp::SingleAppendOp(uint64_t length)
213+
: ReadWriteOp<OpType::Append, 1>({0}, {length}) {}
214+
215+
std::unique_ptr<SingleAppendOp> SingleAppendOp::generate(uint64_t length) {
216+
return std::make_unique<SingleAppendOp>(length);
217+
}
218+
219+
TruncateOp::TruncateOp(uint64_t size)
220+
: TestOp<OpType::Truncate>(), size(size) {}
221+
222+
std::unique_ptr<TruncateOp> TruncateOp::generate(uint64_t size) {
223+
return std::make_unique<TruncateOp>(size);
224+
}
225+
226+
std::string TruncateOp::to_string(uint64_t block_size) const {
227+
return "Truncate (size=" + value_to_string(size * block_size) + ")";
228+
}
229+
203230
SingleFailedWriteOp::SingleFailedWriteOp(uint64_t offset, uint64_t length)
204231
: ReadWriteOp<OpType::FailedWrite, 1>({offset}, {length}) {}
205232

@@ -313,4 +340,4 @@ std::unique_ptr<ceph::io_exerciser::ClearWriteErrorInjectOp>
313340
ceph::io_exerciser ::ClearWriteErrorInjectOp::generate(
314341
int shard, const std::optional<uint64_t>& type) {
315342
return std::make_unique<ClearWriteErrorInjectOp>(shard, type);
316-
}
343+
}

src/common/io_exerciser/IoOp.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,20 @@ class TripleWriteOp : public ReadWriteOp<OpType::Write3, 3> {
125125
uint64_t offset3, uint64_t length3);
126126
};
127127

128+
class SingleAppendOp : public ReadWriteOp<OpType::Append, 1> {
129+
public:
130+
SingleAppendOp(uint64_t length);
131+
static std::unique_ptr<SingleAppendOp> generate(uint64_t length);
132+
};
133+
134+
class TruncateOp : public TestOp<OpType::Truncate> {
135+
public:
136+
TruncateOp(uint64_t size);
137+
static std::unique_ptr<TruncateOp> generate(uint64_t size);
138+
std::string to_string(uint64_t block_size) const override;
139+
uint64_t size;
140+
};
141+
128142
class SingleFailedWriteOp : public ReadWriteOp<OpType::FailedWrite, 1> {
129143
public:
130144
SingleFailedWriteOp(uint64_t offset, uint64_t length);

0 commit comments

Comments
 (0)