]> git.proxmox.com Git - ceph.git/blob - ceph/src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h
09998fbfaea9f04da2deb73a5f2c4d189829b655
[ceph.git] / ceph / src / crimson / os / seastore / onode_manager / staged-fltree / fltree_onode_manager.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:nil -*-
2 // vim: ts=8 sw=2 smarttab
3
4 #pragma once
5
6 #include "crimson/os/seastore/onode_manager.h"
7 #include "crimson/os/seastore/onode_manager/staged-fltree/value.h"
8 #include "crimson/os/seastore/onode_manager/staged-fltree/tree.h"
9
10 namespace crimson::os::seastore::onode {
11
12 struct FLTreeOnode final : Onode, Value {
13 static constexpr tree_conf_t TREE_CONF = {
14 value_magic_t::ONODE,
15 256, // max_ns_size
16 // same to option osd_max_object_namespace_len
17 2048, // max_oid_size
18 // same to option osd_max_object_name_len
19 1200, // max_value_payload_size
20 // see crimson::os::seastore::onode_layout_t
21 8192, // internal_node_size
22 // see the formula in validate_tree_config
23 16384 // leaf_node_size
24 // see the formula in validate_tree_config
25 };
26
27 enum class status_t {
28 STABLE,
29 MUTATED,
30 DELETED
31 } status = status_t::STABLE;
32
33 FLTreeOnode(FLTreeOnode&&) = default;
34 FLTreeOnode& operator=(FLTreeOnode&&) = delete;
35
36 FLTreeOnode(const FLTreeOnode&) = default;
37 FLTreeOnode& operator=(const FLTreeOnode&) = delete;
38
39 template <typename... T>
40 FLTreeOnode(uint32_t ddr, uint32_t dmr, T&&... args)
41 : Onode(ddr, dmr),
42 Value(std::forward<T>(args)...) {}
43
44 template <typename... T>
45 FLTreeOnode(T&&... args)
46 : Onode(0, 0),
47 Value(std::forward<T>(args)...) {}
48
49 struct Recorder : public ValueDeltaRecorder {
50 Recorder(bufferlist &bl) : ValueDeltaRecorder(bl) {}
51
52 value_magic_t get_header_magic() const final {
53 return TREE_CONF.value_magic;
54 }
55
56 void apply_value_delta(
57 ceph::bufferlist::const_iterator &bliter,
58 NodeExtentMutable &value,
59 laddr_t) final {
60 assert(value.get_length() == sizeof(onode_layout_t));
61 bliter.copy(value.get_length(), value.get_write());
62 }
63
64 void record_delta(NodeExtentMutable &value) {
65 // TODO: probably could use versioning, etc
66 assert(value.get_length() == sizeof(onode_layout_t));
67 ceph::buffer::ptr bptr(value.get_length());
68 memcpy(bptr.c_str(), value.get_read(), value.get_length());
69 get_encoded(value).append(bptr);
70 }
71 };
72
73 bool is_alive() const {
74 return status != status_t::DELETED;
75 }
76 const onode_layout_t &get_layout() const final {
77 assert(status != status_t::DELETED);
78 return *read_payload<onode_layout_t>();
79 }
80
81 onode_layout_t &get_mutable_layout(Transaction &t) final {
82 assert(status != status_t::DELETED);
83 auto p = prepare_mutate_payload<
84 onode_layout_t,
85 Recorder>(t);
86 status = status_t::MUTATED;
87 return *reinterpret_cast<onode_layout_t*>(p.first.get_write());
88 };
89
90 void populate_recorder(Transaction &t) {
91 assert(status == status_t::MUTATED);
92 auto p = prepare_mutate_payload<
93 onode_layout_t,
94 Recorder>(t);
95 if (p.second) {
96 p.second->record_delta(
97 p.first);
98 }
99 status = status_t::STABLE;
100 }
101
102 void mark_delete() {
103 assert(status != status_t::DELETED);
104 status = status_t::DELETED;
105 }
106
107 laddr_t get_hint() const final {
108 return Value::get_hint();
109 }
110 ~FLTreeOnode() final {}
111 };
112
113 using OnodeTree = Btree<FLTreeOnode>;
114
115 using crimson::common::get_conf;
116
117 class FLTreeOnodeManager : public crimson::os::seastore::OnodeManager {
118 OnodeTree tree;
119
120 uint32_t default_data_reservation = 0;
121 uint32_t default_metadata_offset = 0;
122 uint32_t default_metadata_range = 0;
123 public:
124 FLTreeOnodeManager(TransactionManager &tm) :
125 tree(NodeExtentManager::create_seastore(tm)),
126 default_data_reservation(
127 get_conf<uint64_t>("seastore_default_max_object_size")),
128 default_metadata_offset(default_data_reservation),
129 default_metadata_range(
130 get_conf<uint64_t>("seastore_default_object_metadata_reservation"))
131 {}
132
133 mkfs_ret mkfs(Transaction &t) {
134 return tree.mkfs(t);
135 }
136
137 contains_onode_ret contains_onode(
138 Transaction &trans,
139 const ghobject_t &hoid) final;
140
141 get_onode_ret get_onode(
142 Transaction &trans,
143 const ghobject_t &hoid) final;
144
145 get_or_create_onode_ret get_or_create_onode(
146 Transaction &trans,
147 const ghobject_t &hoid) final;
148
149 get_or_create_onodes_ret get_or_create_onodes(
150 Transaction &trans,
151 const std::vector<ghobject_t> &hoids) final;
152
153 write_dirty_ret write_dirty(
154 Transaction &trans,
155 const std::vector<OnodeRef> &onodes) final;
156
157 erase_onode_ret erase_onode(
158 Transaction &trans,
159 OnodeRef &onode) final;
160
161 list_onodes_ret list_onodes(
162 Transaction &trans,
163 const ghobject_t& start,
164 const ghobject_t& end,
165 uint64_t limit) final;
166
167 ~FLTreeOnodeManager();
168 };
169 using FLTreeOnodeManagerRef = std::unique_ptr<FLTreeOnodeManager>;
170
171 }