]>
git.proxmox.com Git - ceph.git/blob - ceph/src/test/common/ObjectContents.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 #include "ObjectContents.h"
3 #include "include/buffer.h"
7 bool test_object_contents()
10 ceph_assert(!c
.exists());
13 ceph_assert(c
.exists());
14 ceph_assert(c
.size() == 20);
18 for (ObjectContents::Iterator iter
= c
.get_iterator();
23 ceph_assert(bl
.length() == 20);
26 for (unsigned i
= 0; i
< 8; ++i
) bl2
.append(bl
[i
]);
29 ObjectContents::Iterator iter
= c
.get_iterator();
36 for (unsigned i
= 12; i
< 20; ++i
) bl2
.append(bl
[i
]);
37 ceph_assert(bl2
.length() == 20);
39 for (ObjectContents::Iterator iter3
= c
.get_iterator();
42 ceph_assert(bl2
[iter3
.get_pos()] == *iter3
);
45 ceph_assert(bl2
[0] == '\0');
46 ceph_assert(bl2
[7] == '\0');
48 interval_set
<uint64_t> to_clone
;
49 to_clone
.insert(5, 10);
50 d
.clone_range(c
, to_clone
);
51 ceph_assert(d
.size() == 15);
56 ObjectContents::Iterator iter2
= d
.get_iterator();
58 for (uint64_t i
= 5; i
< 15; ++i
, ++iter2
) {
59 std::cerr
<< "i is " << i
<< std::endl
;
60 ceph_assert(iter2
.get_pos() == i
);
61 ceph_assert(*iter2
== bl2
[i
]);
67 unsigned int ObjectContents::Iterator::get_state(uint64_t _pos
)
69 if (parent
->seeds
.count(_pos
)) {
70 return parent
->seeds
[_pos
];
76 void ObjectContents::clone_range(ObjectContents
&other
,
77 interval_set
<uint64_t> &intervals
)
79 interval_set
<uint64_t> written_to_clone
;
80 written_to_clone
.intersection_of(intervals
, other
.written
);
82 interval_set
<uint64_t> zeroed
= intervals
;
83 zeroed
.subtract(written_to_clone
);
85 written
.union_of(intervals
);
86 written
.subtract(zeroed
);
88 for (interval_set
<uint64_t>::iterator i
= written_to_clone
.begin();
89 i
!= written_to_clone
.end();
91 uint64_t start
= i
.get_start();
92 uint64_t len
= i
.get_len();
94 unsigned int seed
= get_iterator().get_state(start
+len
);
96 seeds
[start
+len
] = seed
;
97 seeds
.erase(seeds
.lower_bound(start
), seeds
.lower_bound(start
+len
));
99 seeds
[start
] = other
.get_iterator().get_state(start
);
100 seeds
.insert(other
.seeds
.upper_bound(start
),
101 other
.seeds
.lower_bound(start
+len
));
104 if (intervals
.range_end() > _size
)
105 _size
= intervals
.range_end();
110 void ObjectContents::write(unsigned int seed
,
115 unsigned int _seed
= get_iterator().get_state(start
+len
);
116 seeds
[start
+len
] = _seed
;
117 seeds
.erase(seeds
.lower_bound(start
),
118 seeds
.lower_bound(start
+len
));
121 interval_set
<uint64_t> to_write
;
122 to_write
.insert(start
, len
);
123 written
.union_of(to_write
);
125 if (start
+ len
> _size
)