]>
git.proxmox.com Git - ceph.git/blob - ceph/src/os/bluestore/bluefs_types.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
5 #include "bluefs_types.h"
6 #include "common/Formatter.h"
7 #include "include/uuid.h"
8 #include "include/stringify.h"
13 using ceph::bufferlist
;
14 using ceph::Formatter
;
17 void bluefs_extent_t::dump(Formatter
*f
) const
19 f
->dump_unsigned("offset", offset
);
20 f
->dump_unsigned("length", length
);
21 f
->dump_unsigned("bdev", bdev
);
24 void bluefs_extent_t::generate_test_instances(list
<bluefs_extent_t
*>& ls
)
26 ls
.push_back(new bluefs_extent_t
);
27 ls
.push_back(new bluefs_extent_t
);
28 ls
.back()->offset
= 1;
29 ls
.back()->length
= 2;
33 ostream
& operator<<(ostream
& out
, const bluefs_extent_t
& e
)
35 return out
<< (int)e
.bdev
<< ":0x" << std::hex
<< e
.offset
<< "~" << e
.length
41 void bluefs_layout_t::encode(bufferlist
& bl
) const
43 ENCODE_START(1, 1, bl
);
44 encode(shared_bdev
, bl
);
45 encode(dedicated_db
, bl
);
46 encode(dedicated_wal
, bl
);
50 void bluefs_layout_t::decode(bufferlist::const_iterator
& p
)
53 decode(shared_bdev
, p
);
54 decode(dedicated_db
, p
);
55 decode(dedicated_wal
, p
);
59 void bluefs_layout_t::dump(Formatter
*f
) const
61 f
->dump_stream("shared_bdev") << shared_bdev
;
62 f
->dump_stream("dedicated_db") << dedicated_db
;
63 f
->dump_stream("dedicated_wal") << dedicated_wal
;
68 void bluefs_super_t::encode(bufferlist
& bl
) const
70 ENCODE_START(2, 1, bl
);
74 encode(block_size
, bl
);
75 encode(log_fnode
, bl
);
76 encode(memorized_layout
, bl
);
80 void bluefs_super_t::decode(bufferlist::const_iterator
& p
)
86 decode(block_size
, p
);
89 decode(memorized_layout
, p
);
94 void bluefs_super_t::dump(Formatter
*f
) const
96 f
->dump_stream("uuid") << uuid
;
97 f
->dump_stream("osd_uuid") << osd_uuid
;
98 f
->dump_unsigned("version", version
);
99 f
->dump_unsigned("block_size", block_size
);
100 f
->dump_object("log_fnode", log_fnode
);
103 void bluefs_super_t::generate_test_instances(list
<bluefs_super_t
*>& ls
)
105 ls
.push_back(new bluefs_super_t
);
106 ls
.push_back(new bluefs_super_t
);
107 ls
.back()->version
= 1;
108 ls
.back()->block_size
= 4096;
111 ostream
& operator<<(ostream
& out
, const bluefs_super_t
& s
)
113 return out
<< "super(uuid " << s
.uuid
114 << " osd " << s
.osd_uuid
115 << " v " << s
.version
116 << " block_size 0x" << std::hex
<< s
.block_size
117 << " log_fnode 0x" << s
.log_fnode
123 mempool::bluefs::vector
<bluefs_extent_t
>::iterator
bluefs_fnode_t::seek(
124 uint64_t offset
, uint64_t *x_off
)
126 auto p
= extents
.begin();
128 if (extents_index
.size() > 4) {
129 auto it
= std::upper_bound(extents_index
.begin(), extents_index
.end(),
131 assert(it
!= extents_index
.begin());
133 assert(offset
>= *it
);
134 p
+= it
- extents_index
.begin();
138 while (p
!= extents
.end()) {
139 if ((int64_t) offset
>= p
->length
) {
150 bluefs_fnode_delta_t
* bluefs_fnode_t::make_delta(bluefs_fnode_delta_t
* delta
) {
154 delta
->mtime
= mtime
;
155 delta
->offset
= allocated_commited
;
156 delta
->extents
.clear();
157 if (allocated_commited
< allocated
) {
159 auto p
= seek(allocated_commited
, &x_off
);
160 ceph_assert(p
!= extents
.end());
162 ceph_assert(x_off
< p
->length
);
163 delta
->extents
.emplace_back(p
->bdev
, p
->offset
+ x_off
, p
->length
- x_off
);
166 while (p
!= extents
.end()) {
167 delta
->extents
.push_back(*p
);
174 void bluefs_fnode_t::dump(Formatter
*f
) const
176 f
->dump_unsigned("ino", ino
);
177 f
->dump_unsigned("size", size
);
178 f
->dump_stream("mtime") << mtime
;
179 f
->open_array_section("extents");
180 for (auto& p
: extents
)
181 f
->dump_object("extent", p
);
185 void bluefs_fnode_t::generate_test_instances(list
<bluefs_fnode_t
*>& ls
)
187 ls
.push_back(new bluefs_fnode_t
);
188 ls
.push_back(new bluefs_fnode_t
);
189 ls
.back()->ino
= 123;
190 ls
.back()->size
= 1048576;
191 ls
.back()->mtime
= utime_t(123,45);
192 ls
.back()->extents
.push_back(bluefs_extent_t(0, 1048576, 4096));
193 ls
.back()->__unused__
= 1;
196 ostream
& operator<<(ostream
& out
, const bluefs_fnode_t
& file
)
198 return out
<< "file(ino " << file
.ino
199 << " size 0x" << std::hex
<< file
.size
<< std::dec
200 << " mtime " << file
.mtime
201 << " allocated " << std::hex
<< file
.allocated
<< std::dec
202 << " alloc_commit " << std::hex
<< file
.allocated_commited
<< std::dec
203 << " extents " << file
.extents
207 // bluefs_fnode_delta_t
209 std::ostream
& operator<<(std::ostream
& out
, const bluefs_fnode_delta_t
& delta
)
211 return out
<< "delta(ino " << delta
.ino
212 << " size 0x" << std::hex
<< delta
.size
<< std::dec
213 << " mtime " << delta
.mtime
214 << " offset " << std::hex
<< delta
.offset
<< std::dec
215 << " extents " << delta
.extents
219 // bluefs_transaction_t
221 void bluefs_transaction_t::encode(bufferlist
& bl
) const
223 uint32_t crc
= op_bl
.crc32c(-1);
224 ENCODE_START(1, 1, bl
);
227 // not using bufferlist encode method, as it merely copies the bufferptr and not
228 // contents, meaning we're left with fragmented target bl
229 __u32 len
= op_bl
.length();
231 for (auto& it
: op_bl
.buffers()) {
232 bl
.append(it
.c_str(), it
.length());
238 void bluefs_transaction_t::decode(bufferlist::const_iterator
& p
)
247 uint32_t actual
= op_bl
.crc32c(-1);
249 throw ceph::buffer::malformed_input("bad crc " + stringify(actual
)
250 + " expected " + stringify(crc
));
253 void bluefs_transaction_t::dump(Formatter
*f
) const
255 f
->dump_stream("uuid") << uuid
;
256 f
->dump_unsigned("seq", seq
);
257 f
->dump_unsigned("op_bl_length", op_bl
.length());
258 f
->dump_unsigned("crc", op_bl
.crc32c(-1));
261 void bluefs_transaction_t::generate_test_instances(
262 list
<bluefs_transaction_t
*>& ls
)
264 ls
.push_back(new bluefs_transaction_t
);
265 ls
.push_back(new bluefs_transaction_t
);
266 ls
.back()->op_init();
267 ls
.back()->op_dir_create("dir");
268 ls
.back()->op_dir_create("dir2");
269 bluefs_fnode_t fnode
;
271 ls
.back()->op_file_update(fnode
);
272 ls
.back()->op_dir_link("dir", "file1", 2);
273 ls
.back()->op_dir_unlink("dir", "file1");
274 ls
.back()->op_file_remove(2);
275 ls
.back()->op_dir_remove("dir2");
278 ostream
& operator<<(ostream
& out
, const bluefs_transaction_t
& t
)
280 return out
<< "txn(seq " << t
.seq
281 << " len 0x" << std::hex
<< t
.op_bl
.length()
282 << " crc 0x" << t
.op_bl
.crc32c(-1)