Skip to content

Commit 1adfe92

Browse files
bill-scalesaainscow
authored andcommitted
test: ceph_test_rados_io_sequence - seq 14 - write object filling gaps
New sequence - write object initially with gaps and fill in the holes until the object is fully populated. Permutate the step (gap between writes), start at randomized offsets to produce gaps at the start of the object as well as between writes Signed-off-by: Bill Scales <[email protected]>
1 parent 146e4d7 commit 1adfe92

File tree

3 files changed

+95
-0
lines changed

3 files changed

+95
-0
lines changed

src/common/io_exerciser/EcIoSequence.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ std::unique_ptr<IoSequence> EcIoSequence::generate_sequence(
3939
case Sequence::SEQUENCE_SEQ12:
4040
[[fallthrough]];
4141
case Sequence::SEQUENCE_SEQ13:
42+
[[fallthrough]];
43+
case Sequence::SEQUENCE_SEQ14:
4244
return std::make_unique<ReadInjectSequence>(obj_size_range, seed,
4345
sequence, k, m);
4446
case Sequence::SEQUENCE_SEQ10:

src/common/io_exerciser/IoSequence.cc

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "IoSequence.h"
2+
#include <algorithm>
23

34
using IoOp = ceph::io_exerciser::IoOp;
45
using Sequence = ceph::io_exerciser::Sequence;
@@ -49,6 +50,9 @@ std::ostream& ceph::io_exerciser::operator<<(std::ostream& os,
4950
case Sequence::SEQUENCE_SEQ13:
5051
os << "SEQUENCE_SEQ13";
5152
break;
53+
case Sequence::SEQUENCE_SEQ14:
54+
os << "SEQUENCE_SEQ14";
55+
break;
5256
case Sequence::SEQUENCE_END:
5357
os << "SEQUENCE_END";
5458
break;
@@ -94,6 +98,8 @@ std::unique_ptr<IoSequence> IoSequence::generate_sequence(
9498
return std::make_unique<Seq12>(obj_size_range, seed);
9599
case Sequence::SEQUENCE_SEQ13:
96100
return std::make_unique<Seq13>(obj_size_range, seed);
101+
case Sequence::SEQUENCE_SEQ14:
102+
return std::make_unique<Seq14>(obj_size_range, seed);
97103
default:
98104
break;
99105
}
@@ -636,3 +642,69 @@ std::unique_ptr<ceph::io_exerciser::IoOp> ceph::io_exerciser::Seq13::_next() {
636642
barrier = true;
637643
return SingleWriteOp::generate((count * obj_size) + gap, obj_size - gap);
638644
}
645+
646+
ceph::io_exerciser::Seq14::Seq14(std::pair<int, int> obj_size_range, int seed)
647+
: IoSequence(std::make_pair(0, obj_size_range.second), seed),
648+
offset(0),
649+
step(1) {
650+
startrng = std::default_random_engine(seed);
651+
target_obj_size = std::max(obj_size_range.first, 3);
652+
if (target_obj_size > max_obj_size) {
653+
done = true;
654+
}
655+
setup_starts();
656+
}
657+
658+
void ceph::io_exerciser::Seq14::setup_starts() {
659+
starts.resize(step);
660+
for (size_t i = 0; i < step; i++) {
661+
starts[i] = i;
662+
}
663+
std::shuffle(std::begin(starts), std::end(starts), startrng);
664+
startidx = 0;
665+
offset = starts[0];
666+
}
667+
668+
Sequence ceph::io_exerciser::Seq14::get_id() const {
669+
return Sequence::SEQUENCE_SEQ14;
670+
}
671+
672+
std::string ceph::io_exerciser::Seq14::get_name() const {
673+
return "Permutations of gap stepped write I/Os";
674+
}
675+
676+
std::unique_ptr<ceph::io_exerciser::IoOp> ceph::io_exerciser::Seq14::_next() {
677+
if (offset >= target_obj_size) {
678+
if (!doneread) {
679+
doneread = true;
680+
return SingleReadOp::generate(0, current_size);
681+
}
682+
doneread = false;
683+
startidx++;
684+
if (startidx >= starts.size()) {
685+
step++;
686+
current_size = 0;
687+
create = true;
688+
barrier = true;
689+
remove = true;
690+
if (step >= target_obj_size) {
691+
step = 1;
692+
target_obj_size++;
693+
if (target_obj_size > max_obj_size) {
694+
done = true;
695+
}
696+
}
697+
setup_starts();
698+
} else {
699+
offset = starts[startidx];
700+
}
701+
return BarrierOp::generate();
702+
}
703+
std::unique_ptr<IoOp> r = SingleWriteOp::generate(offset, 1);
704+
current_size = std::max(current_size, offset + 1);
705+
offset += step;
706+
if (offset >= target_obj_size) {
707+
barrier = true;
708+
}
709+
return r;
710+
}

src/common/io_exerciser/IoSequence.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ enum class Sequence {
4545
SEQUENCE_SEQ11,
4646
SEQUENCE_SEQ12,
4747
SEQUENCE_SEQ13,
48+
SEQUENCE_SEQ14,
4849

4950
SEQUENCE_END,
5051
SEQUENCE_BEGIN = SEQUENCE_SEQ0
@@ -279,5 +280,25 @@ class Seq13 : public IoSequence {
279280
std::string get_name() const override;
280281
std::unique_ptr<IoOp> _next() override;
281282
};
283+
284+
class Seq14 : public IoSequence {
285+
private:
286+
uint64_t offset;
287+
uint64_t step;
288+
uint64_t target_obj_size;
289+
uint64_t current_size = 0;
290+
std::default_random_engine startrng;
291+
std::vector<uint64_t> starts;
292+
size_t startidx;
293+
bool doneread = false;
294+
295+
public:
296+
Seq14(std::pair<int, int> obj_size_range, int seed);
297+
298+
void setup_starts();
299+
Sequence get_id() const override;
300+
std::string get_name() const override;
301+
std::unique_ptr<IoOp> _next() override;
302+
};
282303
} // namespace io_exerciser
283304
} // namespace ceph

0 commit comments

Comments
 (0)