uint64_t pos = off;
uint64_t limit = off + get_append_size(cont);
while (pos < limit) {
- uint64_t segment_length = (
- rand() % (max_append_size - min_append_size)) + min_append_size;
- assert(segment_length < max_append_size);
+ uint64_t segment_length = round_up(
+ rand() % (max_append_size - min_append_size),
+ alignment) + min_append_size;
assert(segment_length >= min_append_size);
if (segment_length + pos > limit) {
segment_length = limit - pos;
}
+ if (alignment)
+ assert(segment_length % alignment == 0);
out.insert(make_pair(pos, segment_length));
pos += segment_length;
}
class AppendGenerator : public RandGenerator {
uint64_t off;
+ uint64_t alignment;
uint64_t min_append_size;
uint64_t max_append_size;
uint64_t max_append_total;
+
+ uint64_t round_up(uint64_t in, uint64_t by) {
+ if (by)
+ in += (by - (in % by));
+ return in;
+ }
+
public:
AppendGenerator(
uint64_t off,
+ uint64_t alignment,
uint64_t min_append_size,
- uint64_t max_append_size,
- uint64_t max_append_total) :
- off(off), min_append_size(min_append_size),
- max_append_size(max_append_size),
- max_append_total(max_append_total) {}
+ uint64_t _max_append_size,
+ uint64_t max_append_multiple) :
+ off(off), alignment(alignment),
+ min_append_size(round_up(min_append_size, alignment)),
+ max_append_size(round_up(_max_append_size, alignment)) {
+ if (_max_append_size == min_append_size)
+ max_append_size += alignment;
+ max_append_total = max_append_multiple * max_append_size;
+ }
uint64_t get_append_size(const ContDesc &in) {
RandWrap rand(in.seqnum);
- return rand() % max_append_total;
+ return round_up(rand() % max_append_total, alignment);
}
uint64_t get_length(const ContDesc &in) {
return off + get_append_size(in);
0;
cont_gen = new AppendGenerator(
prev_length,
+ (context->io_ctx.pool_requires_alignment() ?
+ context->io_ctx.pool_required_alignment() : 0),
context->min_stride_size,
context->max_stride_size,
- 3 * context->max_stride_size);
+ 3);
} else {
cont_gen = new VarLenGenerator(
context->max_size, context->min_stride_size, context->max_stride_size);