1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 #include "include/interval_set.h"
3 #include "include/buffer.h"
11 void ContDesc::encode(bufferlist &bl) const
13 ENCODE_START(1, 1, bl);
15 ::encode(cursnap, bl);
22 void ContDesc::decode(bufferlist::iterator &bl)
26 ::decode(cursnap, bl);
33 std::ostream &operator<<(std::ostream &out, const ContDesc &rhs)
35 return out << "(ObjNum " << rhs.objnum
36 << " snap " << rhs.cursnap
37 << " seq_num " << rhs.seqnum
41 void AppendGenerator::get_ranges_map(
42 const ContDesc &cont, std::map<uint64_t, uint64_t> &out) {
43 RandWrap rand(cont.seqnum);
45 uint64_t limit = off + get_append_size(cont);
47 uint64_t segment_length = round_up(
48 rand() % (max_append_size - min_append_size),
49 alignment) + min_append_size;
50 assert(segment_length >= min_append_size);
51 if (segment_length + pos > limit) {
52 segment_length = limit - pos;
55 assert(segment_length % alignment == 0);
56 out.insert(std::pair<uint64_t, uint64_t>(pos, segment_length));
57 pos += segment_length;
61 void VarLenGenerator::get_ranges_map(
62 const ContDesc &cont, std::map<uint64_t, uint64_t> &out) {
63 RandWrap rand(cont.seqnum);
65 uint64_t limit = get_length(cont);
68 uint64_t segment_length = (rand() % (max_stride_size - min_stride_size)) + min_stride_size;
69 assert(segment_length < max_stride_size);
70 assert(segment_length >= min_stride_size);
71 if (segment_length + pos > limit) {
72 segment_length = limit - pos;
75 out.insert(std::pair<uint64_t, uint64_t>(pos, segment_length));
80 pos += segment_length;
84 void ObjectDesc::iterator::adjust_stack() {
85 while (!stack.empty() && pos >= stack.front().second.next) {
86 assert(pos == stack.front().second.next);
87 size = stack.front().second.size;
88 current = stack.front().first;
93 cur_valid_till = std::numeric_limits<uint64_t>::max();
95 cur_valid_till = stack.front().second.next;
98 while (current != layers.end() && !current->covers(pos)) {
99 uint64_t next = current->next(pos);
100 if (next < cur_valid_till) {
104 StackState{next, size}
107 cur_valid_till = next;
113 if (current == layers.end()) {
116 current->iter.seek(pos);
117 size = std::min(size, current->get_size());
118 cur_valid_till = std::min(
119 current->valid_till(pos),
124 const ContDesc &ObjectDesc::most_recent() {
125 return layers.begin()->second;
128 void ObjectDesc::update(ContentsGenerator *gen, const ContDesc &next) {
129 layers.push_front(std::pair<ceph::shared_ptr<ContentsGenerator>, ContDesc>(ceph::shared_ptr<ContentsGenerator>(gen), next));
133 bool ObjectDesc::check(bufferlist &to_check) {
134 iterator objiter = begin();
135 uint64_t error_at = 0;
136 if (!objiter.check_bl_advance(to_check, &error_at)) {
137 std::cout << "incorrect buffer at pos " << error_at << std::endl;
141 uint64_t size = layers.begin()->first->get_length(layers.begin()->second);
142 if (to_check.length() < size) {
143 std::cout << "only read " << to_check.length()
144 << " out of size " << size << std::endl;
150 bool ObjectDesc::check_sparse(const std::map<uint64_t, uint64_t>& extents,
151 bufferlist &to_check)
155 auto objiter = begin();
156 for (auto &&extiter : extents) {
160 bl.append_zero(extiter.first - pos);
161 uint64_t error_at = 0;
162 if (!objiter.check_bl_advance(bl, &error_at)) {
163 std::cout << "sparse read omitted non-zero data at "
164 << error_at << std::endl;
169 assert(off <= to_check.length());
178 std::min(to_check.length() - off, extiter.second));
179 uint64_t error_at = 0;
180 if (!objiter.check_bl_advance(bl, &error_at)) {
181 std::cout << "incorrect buffer at pos " << error_at << std::endl;
184 off += extiter.second;
185 pos += extiter.second;
188 if (pos < extiter.first + extiter.second) {
189 std::cout << "reached end of iterator first" << std::endl;
196 uint64_t size = layers.begin()->first->get_length(layers.begin()->second);
197 bl.append_zero(size - pos);
199 if (!objiter.check_bl_advance(bl, &error_at)) {
200 std::cout << "sparse read omitted non-zero data at "
201 << error_at << std::endl;