Skip to content

Commit fff72a0

Browse files
bill-scalesaainscow
authored andcommitted
test: ceph_test_rados_io_sequence - add append with gaps sequence
New I/O sequence - appends to objects by writing past the old object length so there is a gap before the new written data. Tests permutations of write length and gap length. Signed-off-by: Bill Scales <[email protected]>
1 parent f3ee875 commit fff72a0

File tree

6 files changed

+94
-24
lines changed

6 files changed

+94
-24
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: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ std::unique_ptr<IoSequence> EcIoSequence::generate_sequence(
3737
case Sequence::SEQUENCE_SEQ11:
3838
[[fallthrough]];
3939
case Sequence::SEQUENCE_SEQ12:
40+
[[fallthrough]];
41+
case Sequence::SEQUENCE_SEQ13:
4042
return std::make_unique<ReadInjectSequence>(obj_size_range, seed,
4143
sequence, k, m);
4244
case Sequence::SEQUENCE_SEQ10:

src/common/io_exerciser/IoSequence.cc

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ std::ostream& ceph::io_exerciser::operator<<(std::ostream& os,
4646
case Sequence::SEQUENCE_SEQ12:
4747
os << "SEQUENCE_SEQ12";
4848
break;
49+
case Sequence::SEQUENCE_SEQ13:
50+
os << "SEQUENCE_SEQ13";
51+
break;
4952
case Sequence::SEQUENCE_END:
5053
os << "SEQUENCE_END";
5154
break;
@@ -89,6 +92,8 @@ std::unique_ptr<IoSequence> IoSequence::generate_sequence(
8992
return std::make_unique<Seq11>(obj_size_range, seed);
9093
case Sequence::SEQUENCE_SEQ12:
9194
return std::make_unique<Seq12>(obj_size_range, seed);
95+
case Sequence::SEQUENCE_SEQ13:
96+
return std::make_unique<Seq13>(obj_size_range, seed);
9297
default:
9398
break;
9499
}
@@ -594,3 +599,40 @@ std::unique_ptr<ceph::io_exerciser::IoOp> ceph::io_exerciser::Seq12::_next() {
594599
return SingleWriteOp::generate((count * obj_size) - overlap,
595600
obj_size + overlap);
596601
}
602+
603+
ceph::io_exerciser::Seq13::Seq13(std::pair<int, int> obj_size_range, int seed)
604+
: IoSequence(obj_size_range, seed), count(0), gap(1), doneread(false) {
605+
set_min_object_size(2);
606+
}
607+
608+
Sequence ceph::io_exerciser::Seq13::get_id() const {
609+
return Sequence::SEQUENCE_SEQ13;
610+
}
611+
612+
std::string ceph::io_exerciser::Seq13::get_name() const {
613+
return "Permutations of length sequential gap+append I/O";
614+
}
615+
616+
std::unique_ptr<ceph::io_exerciser::IoOp> ceph::io_exerciser::Seq13::_next() {
617+
if (count >= 16) {
618+
if (!doneread) {
619+
doneread = true;
620+
return SingleReadOp::generate(0, obj_size * (count + 1));
621+
}
622+
doneread = false;
623+
count = 0;
624+
gap++;
625+
if (gap >= obj_size) {
626+
gap = 1;
627+
return increment_object_size();
628+
} else {
629+
create = true;
630+
barrier = true;
631+
remove = true;
632+
return BarrierOp::generate();
633+
}
634+
}
635+
count++;
636+
barrier = true;
637+
return SingleWriteOp::generate((count * obj_size) + gap, obj_size - gap);
638+
}

src/common/io_exerciser/IoSequence.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ enum class Sequence {
4444
SEQUENCE_SEQ10,
4545
SEQUENCE_SEQ11,
4646
SEQUENCE_SEQ12,
47+
SEQUENCE_SEQ13,
4748

4849
SEQUENCE_END,
4950
SEQUENCE_BEGIN = SEQUENCE_SEQ0
@@ -263,5 +264,20 @@ class Seq12 : public IoSequence {
263264
std::string get_name() const override;
264265
std::unique_ptr<IoOp> _next() override;
265266
};
267+
268+
class Seq13 : public IoSequence {
269+
private:
270+
uint64_t count;
271+
uint64_t gap;
272+
bool doneread = true;
273+
bool donebarrier = false;
274+
275+
public:
276+
Seq13(std::pair<int, int> obj_size_range, int seed);
277+
278+
Sequence get_id() const override;
279+
std::string get_name() const override;
280+
std::unique_ptr<IoOp> _next() override;
281+
};
266282
} // namespace io_exerciser
267283
} // namespace ceph

src/common/io_exerciser/ObjectModel.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ std::string ObjectModel::to_string(int mask) const {
4545
bool ObjectModel::readyForIoOp(IoOp& op) { return true; }
4646

4747
void ObjectModel::applyIoOp(IoOp& op) {
48-
auto generate_random = [&rng = rng]() { return rng(); };
48+
auto generate_random = [&rng = rng]() {
49+
return rng(1, std::numeric_limits<int>::max());
50+
};
4951

5052
auto verify_and_record_read_op =
5153
[&contents = contents, &created = created, &num_io = num_io,

0 commit comments

Comments
 (0)