ceph::bufferptr SeededRandomGenerator::generate_block(uint64_t block_offset) {
uint64_t block_size = m_model.get_block_size();
char buffer[block_size];
+ SeedBytes seed = m_model.get_seed(block_offset);
+ if (seed != 0) {
+ std::mt19937_64 random_generator(seed);
+ uint64_t rand1 = random_generator();
+ uint64_t rand2 = random_generator();
- std::mt19937_64 random_generator(m_model.get_seed(block_offset));
- uint64_t rand1 = random_generator();
- uint64_t rand2 = random_generator();
-
- constexpr size_t generation_length = sizeof(uint64_t);
+ constexpr size_t generation_length = sizeof(uint64_t);
- for (uint64_t i = 0; i < block_size;
- i += (2 * generation_length), rand1++, rand2--) {
- std::memcpy(buffer + i, &rand1, generation_length);
- std::memcpy(buffer + i + generation_length, &rand2, generation_length);
- }
+ for (uint64_t i = 0; i < block_size;
+ i += (2 * generation_length), rand1++, rand2--) {
+ std::memcpy(buffer + i, &rand1, generation_length);
+ std::memcpy(buffer + i + generation_length, &rand2, generation_length);
+ }
- size_t remainingBytes = block_size % (generation_length * 2);
- if (remainingBytes > generation_length) {
- size_t remainingBytes2 = remainingBytes - generation_length;
- std::memcpy(buffer + block_size - remainingBytes, &rand1, remainingBytes);
- std::memcpy(buffer + block_size - remainingBytes2, &rand2, remainingBytes2);
- } else if (remainingBytes > 0) {
- std::memcpy(buffer + block_size - remainingBytes, &rand1, remainingBytes);
+ size_t remainingBytes = block_size % (generation_length * 2);
+ if (remainingBytes > generation_length) {
+ size_t remainingBytes2 = remainingBytes - generation_length;
+ std::memcpy(buffer + block_size - remainingBytes, &rand1, remainingBytes);
+ std::memcpy(buffer + block_size - remainingBytes2, &rand2,
+ remainingBytes2);
+ } else if (remainingBytes > 0) {
+ std::memcpy(buffer + block_size - remainingBytes, &rand1, remainingBytes);
+ }
+ } else {
+ std::memset(buffer, 0, block_size);
}
-
return ceph::bufferptr(buffer, block_size);
}
ceph::bufferptr bufferptr =
SeededRandomGenerator::generate_block(block_offset);
- std::memcpy(bufferptr.c_str() + uniqueIdStart(), &unique_run_id,
- uniqueIdLength());
- std::memcpy(bufferptr.c_str() + seedStart(), &seed, seedLength());
- std::memcpy(bufferptr.c_str() + timeStart(), ¤t_time, timeLength());
+ if (seed != 0) {
+ std::memcpy(bufferptr.c_str() + uniqueIdStart(), &unique_run_id,
+ uniqueIdLength());
+ std::memcpy(bufferptr.c_str() + seedStart(), &seed, seedLength());
+ std::memcpy(bufferptr.c_str() + timeStart(), ¤t_time, timeLength());
+ }
return bufferptr;
}
printDebugInformationForRange(read_offset, range_start, range_length,
rangeError, bufferlist);
}
-}
\ No newline at end of file
+}
case Sequence::SEQUENCE_SEQ12:
os << "SEQUENCE_SEQ12";
break;
+ case Sequence::SEQUENCE_SEQ13:
+ os << "SEQUENCE_SEQ13";
+ break;
case Sequence::SEQUENCE_END:
os << "SEQUENCE_END";
break;
return std::make_unique<Seq11>(obj_size_range, seed);
case Sequence::SEQUENCE_SEQ12:
return std::make_unique<Seq12>(obj_size_range, seed);
+ case Sequence::SEQUENCE_SEQ13:
+ return std::make_unique<Seq13>(obj_size_range, seed);
default:
break;
}
return SingleWriteOp::generate((count * obj_size) - overlap,
obj_size + overlap);
}
+
+ceph::io_exerciser::Seq13::Seq13(std::pair<int, int> obj_size_range, int seed)
+ : IoSequence(obj_size_range, seed), count(0), gap(1), doneread(false) {
+ set_min_object_size(2);
+}
+
+Sequence ceph::io_exerciser::Seq13::get_id() const {
+ return Sequence::SEQUENCE_SEQ13;
+}
+
+std::string ceph::io_exerciser::Seq13::get_name() const {
+ return "Permutations of length sequential gap+append I/O";
+}
+
+std::unique_ptr<ceph::io_exerciser::IoOp> ceph::io_exerciser::Seq13::_next() {
+ if (count >= 16) {
+ if (!doneread) {
+ doneread = true;
+ return SingleReadOp::generate(0, obj_size * (count + 1));
+ }
+ doneread = false;
+ count = 0;
+ gap++;
+ if (gap >= obj_size) {
+ gap = 1;
+ return increment_object_size();
+ } else {
+ create = true;
+ barrier = true;
+ remove = true;
+ return BarrierOp::generate();
+ }
+ }
+ count++;
+ barrier = true;
+ return SingleWriteOp::generate((count * obj_size) + gap, obj_size - gap);
+}