]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- |
2 | #include "ObjectContents.h" | |
3 | #include "include/buffer.h" | |
4 | #include <iostream> | |
5 | #include <map> | |
6 | ||
7 | bool test_object_contents() | |
8 | { | |
9 | ObjectContents c, d; | |
11fdf7f2 | 10 | ceph_assert(!c.exists()); |
7c673cae FG |
11 | c.debug(std::cerr); |
12 | c.write(10, 10, 10); | |
11fdf7f2 TL |
13 | ceph_assert(c.exists()); |
14 | ceph_assert(c.size() == 20); | |
7c673cae FG |
15 | |
16 | c.debug(std::cerr); | |
17 | bufferlist bl; | |
18 | for (ObjectContents::Iterator iter = c.get_iterator(); | |
19 | iter.valid(); | |
20 | ++iter) { | |
21 | bl.append(*iter); | |
22 | } | |
11fdf7f2 | 23 | ceph_assert(bl.length() == 20); |
7c673cae FG |
24 | |
25 | bufferlist bl2; | |
26 | for (unsigned i = 0; i < 8; ++i) bl2.append(bl[i]); | |
27 | c.write(10, 8, 4); | |
28 | c.debug(std::cerr); | |
29 | ObjectContents::Iterator iter = c.get_iterator(); | |
30 | iter.seek_to(8); | |
31 | for (uint64_t i = 8; | |
32 | i < 12; | |
33 | ++i, ++iter) { | |
34 | bl2.append(*iter); | |
35 | } | |
36 | for (unsigned i = 12; i < 20; ++i) bl2.append(bl[i]); | |
11fdf7f2 | 37 | ceph_assert(bl2.length() == 20); |
7c673cae FG |
38 | |
39 | for (ObjectContents::Iterator iter3 = c.get_iterator(); | |
40 | iter.valid(); | |
41 | ++iter) { | |
11fdf7f2 | 42 | ceph_assert(bl2[iter3.get_pos()] == *iter3); |
7c673cae FG |
43 | } |
44 | ||
11fdf7f2 TL |
45 | ceph_assert(bl2[0] == '\0'); |
46 | ceph_assert(bl2[7] == '\0'); | |
7c673cae FG |
47 | |
48 | interval_set<uint64_t> to_clone; | |
49 | to_clone.insert(5, 10); | |
50 | d.clone_range(c, to_clone); | |
11fdf7f2 | 51 | ceph_assert(d.size() == 15); |
7c673cae FG |
52 | |
53 | c.debug(std::cerr); | |
54 | d.debug(std::cerr); | |
55 | ||
56 | ObjectContents::Iterator iter2 = d.get_iterator(); | |
57 | iter2.seek_to(5); | |
58 | for (uint64_t i = 5; i < 15; ++i, ++iter2) { | |
59 | std::cerr << "i is " << i << std::endl; | |
11fdf7f2 TL |
60 | ceph_assert(iter2.get_pos() == i); |
61 | ceph_assert(*iter2 == bl2[i]); | |
7c673cae FG |
62 | } |
63 | return true; | |
64 | } | |
65 | ||
66 | ||
67 | unsigned int ObjectContents::Iterator::get_state(uint64_t _pos) | |
68 | { | |
69 | if (parent->seeds.count(_pos)) { | |
70 | return parent->seeds[_pos]; | |
71 | } | |
72 | seek_to(_pos - 1); | |
73 | return current_state; | |
74 | } | |
75 | ||
76 | void ObjectContents::clone_range(ObjectContents &other, | |
77 | interval_set<uint64_t> &intervals) | |
78 | { | |
79 | interval_set<uint64_t> written_to_clone; | |
80 | written_to_clone.intersection_of(intervals, other.written); | |
81 | ||
82 | interval_set<uint64_t> zeroed = intervals; | |
83 | zeroed.subtract(written_to_clone); | |
84 | ||
85 | written.union_of(intervals); | |
86 | written.subtract(zeroed); | |
87 | ||
88 | for (interval_set<uint64_t>::iterator i = written_to_clone.begin(); | |
89 | i != written_to_clone.end(); | |
90 | ++i) { | |
91 | uint64_t start = i.get_start(); | |
92 | uint64_t len = i.get_len(); | |
93 | ||
94 | unsigned int seed = get_iterator().get_state(start+len); | |
95 | ||
96 | seeds[start+len] = seed; | |
97 | seeds.erase(seeds.lower_bound(start), seeds.lower_bound(start+len)); | |
98 | ||
99 | seeds[start] = other.get_iterator().get_state(start); | |
100 | seeds.insert(other.seeds.upper_bound(start), | |
101 | other.seeds.lower_bound(start+len)); | |
102 | } | |
103 | ||
104 | if (intervals.range_end() > _size) | |
105 | _size = intervals.range_end(); | |
106 | _exists = true; | |
107 | return; | |
108 | } | |
109 | ||
110 | void ObjectContents::write(unsigned int seed, | |
111 | uint64_t start, | |
112 | uint64_t len) | |
113 | { | |
114 | _exists = true; | |
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)); | |
119 | seeds[start] = seed; | |
120 | ||
121 | interval_set<uint64_t> to_write; | |
122 | to_write.insert(start, len); | |
123 | written.union_of(to_write); | |
124 | ||
125 | if (start + len > _size) | |
126 | _size = start + len; | |
127 | return; | |
128 | } |