]>
git.proxmox.com Git - ceph.git/blob - ceph/src/test/osd/Object.cc
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
;