]> git.proxmox.com Git - ceph.git/blob - ceph/src/crimson/os/cyanstore/cyan_object.cc
import 15.2.0 Octopus source
[ceph.git] / ceph / src / crimson / os / cyanstore / cyan_object.cc
1 #include "cyan_object.h"
2 #include "include/encoding.h"
3
4 namespace crimson::os {
5
6 size_t Object::get_size() const {
7 return data.length();
8 }
9
10 ceph::bufferlist Object::read(uint64_t offset, uint64_t len)
11 {
12 bufferlist ret;
13 ret.substr_of(data, offset, len);
14 return ret;
15 }
16
17 int Object::write(uint64_t offset, const bufferlist &src)
18 {
19 unsigned len = src.length();
20 // before
21 bufferlist newdata;
22 if (get_size() >= offset) {
23 newdata.substr_of(data, 0, offset);
24 } else {
25 if (get_size()) {
26 newdata.substr_of(data, 0, get_size());
27 }
28 newdata.append_zero(offset - get_size());
29 }
30
31 newdata.append(src);
32
33 // after
34 if (get_size() > offset + len) {
35 bufferlist tail;
36 tail.substr_of(data, offset + len, get_size() - (offset + len));
37 newdata.append(tail);
38 }
39
40 data.claim(newdata);
41 return 0;
42 }
43
44 int Object::clone(Object *src, uint64_t srcoff, uint64_t len,
45 uint64_t dstoff)
46 {
47 bufferlist bl;
48 if (srcoff == dstoff && len == src->get_size()) {
49 data = src->data;
50 return 0;
51 }
52 bl.substr_of(src->data, srcoff, len);
53 return write(dstoff, bl);
54
55 }
56
57 int Object::truncate(uint64_t size)
58 {
59 if (get_size() > size) {
60 bufferlist bl;
61 bl.substr_of(data, 0, size);
62 data.claim(bl);
63 } else if (get_size() == size) {
64 // do nothing
65 } else {
66 data.append_zero(size - get_size());
67 }
68 return 0;
69 }
70
71 void Object::encode(bufferlist& bl) const {
72 ENCODE_START(1, 1, bl);
73 encode(data, bl);
74 encode(xattr, bl);
75 encode(omap_header, bl);
76 encode(omap, bl);
77 ENCODE_FINISH(bl);
78 }
79
80 void Object::decode(bufferlist::const_iterator& p) {
81 DECODE_START(1, p);
82 decode(data, p);
83 decode(xattr, p);
84 decode(omap_header, p);
85 decode(omap, p);
86 DECODE_FINISH(p);
87 }
88
89 }