Skip to content

Commit b8a9b77

Browse files
committed
crimson/os/seastore/onode: add the interface for swapping onode layouts
Signed-off-by: Xuehan Xu <[email protected]>
1 parent 07b7407 commit b8a9b77

File tree

3 files changed

+52
-0
lines changed

3 files changed

+52
-0
lines changed

src/crimson/os/seastore/onode.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ class Onode : public boost::intrusive_ref_counter<
104104
virtual void clear_snapset(Transaction&) = 0;
105105
virtual void set_need_cow(Transaction&) = 0;
106106
virtual void unset_need_cow(Transaction&) = 0;
107+
virtual void swap_layout(Transaction&, Onode&) = 0;
107108

108109
laddr_t get_metadata_hint(uint64_t block_size) const {
109110
assert(default_metadata_offset);

src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,47 @@ struct FLTreeOnode final : Onode, Value {
9393
layout_func(p.first, p.second);
9494
}
9595

96+
void swap_layout(Transaction &t, Onode &onode) final {
97+
_swap_layout(t, static_cast<FLTreeOnode&>(onode));
98+
}
99+
100+
void _swap_layout(Transaction &t, FLTreeOnode &other) {
101+
assert(status != status_t::DELETED);
102+
assert(other.status != status_t::DELETED);
103+
auto [payload_mut, recorder] = prepare_mutate_payload<
104+
onode_layout_t, Recorder>(t);
105+
auto &mlayout = *reinterpret_cast<onode_layout_t*>(
106+
payload_mut.get_write());
107+
auto [o_payload_mut, o_recorder] = other.prepare_mutate_payload<
108+
onode_layout_t, Recorder>(t);
109+
auto &o_mlayout = *reinterpret_cast<onode_layout_t*>(
110+
o_payload_mut.get_write());
111+
std::swap(mlayout.object_data, o_mlayout.object_data);
112+
std::swap(mlayout.omap_root, o_mlayout.omap_root);
113+
std::swap(mlayout.log_root, o_mlayout.log_root);
114+
std::swap(mlayout.xattr_root, o_mlayout.xattr_root);
115+
if (recorder) {
116+
recorder->encode_update(
117+
payload_mut, Recorder::delta_op_t::UPDATE_OBJECT_DATA);
118+
recorder->encode_update(
119+
payload_mut, Recorder::delta_op_t::UPDATE_OMAP_ROOT);
120+
recorder->encode_update(
121+
payload_mut, Recorder::delta_op_t::UPDATE_LOG_ROOT);
122+
recorder->encode_update(
123+
payload_mut, Recorder::delta_op_t::UPDATE_XATTR_ROOT);
124+
}
125+
if (o_recorder) {
126+
o_recorder->encode_update(
127+
o_payload_mut, Recorder::delta_op_t::UPDATE_OBJECT_DATA);
128+
o_recorder->encode_update(
129+
o_payload_mut, Recorder::delta_op_t::UPDATE_OMAP_ROOT);
130+
o_recorder->encode_update(
131+
o_payload_mut, Recorder::delta_op_t::UPDATE_LOG_ROOT);
132+
o_recorder->encode_update(
133+
o_payload_mut, Recorder::delta_op_t::UPDATE_XATTR_ROOT);
134+
}
135+
}
136+
96137
void create_default_layout(Transaction &t) {
97138
with_mutable_layout(
98139
t,

src/test/crimson/seastore/test_object_data_handler.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,16 @@ class TestOnode final : public Onode {
3636
bool is_alive() const final {
3737
return true;
3838
}
39+
void swap_layout(Transaction &t, Onode& other) final {
40+
static_cast<TestOnode&>(other).with_mutable_layout(
41+
t,
42+
[this](auto &o_mlayout) {
43+
std::swap(layout.object_data, o_mlayout.object_data);
44+
std::swap(layout.omap_root, o_mlayout.omap_root);
45+
std::swap(layout.log_root, o_mlayout.log_root);
46+
std::swap(layout.xattr_root, o_mlayout.xattr_root);
47+
});
48+
}
3949
laddr_t get_hint() const final {return L_ADDR_MIN; }
4050
~TestOnode() final = default;
4151

0 commit comments

Comments
 (0)