1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
6 #include "crimson/common/log.h"
8 #include "include/buffer.h"
9 #include "crimson/os/seastore/extentmap_manager/btree/btree_extentmap_manager.h"
10 #include "crimson/os/seastore/extentmap_manager/btree/extentmap_btree_node_impl.h"
13 seastar::logger
& logger() {
14 return crimson::get_logger(ceph_subsys_filestore
);
18 namespace crimson::os::seastore::extentmap_manager
{
20 BtreeExtentMapManager::BtreeExtentMapManager(
21 TransactionManager
&tm
)
24 BtreeExtentMapManager::initialize_extmap_ret
25 BtreeExtentMapManager::initialize_extmap(Transaction
&t
)
28 logger().debug("{}", __func__
);
29 return tm
.alloc_extent
<ExtMapLeafNode
>(t
, L_ADDR_MIN
, EXTMAP_BLOCK_SIZE
)
30 .safe_then([](auto&& root_extent
) {
31 root_extent
->set_size(0);
32 extmap_node_meta_t meta
{1};
33 root_extent
->set_meta(meta
);
34 extmap_root_t extmap_root
= extmap_root_t(1, root_extent
->get_laddr());
35 return initialize_extmap_ertr::make_ready_future
<extmap_root_t
>(extmap_root
);
39 BtreeExtentMapManager::get_root_ret
40 BtreeExtentMapManager::get_extmap_root(const extmap_root_t
&extmap_root
, Transaction
&t
)
42 assert(extmap_root
.extmap_root_laddr
!= L_ADDR_NULL
);
43 laddr_t laddr
= extmap_root
.extmap_root_laddr
;
44 return extmap_load_extent(get_ext_context(t
), laddr
, extmap_root
.depth
);
47 BtreeExtentMapManager::find_lextent_ret
48 BtreeExtentMapManager::find_lextent(const extmap_root_t
&extmap_root
, Transaction
&t
,
49 objaddr_t lo
, extent_len_t len
)
51 logger().debug("{}: {}, {}", __func__
, lo
, len
);
52 return get_extmap_root(extmap_root
, t
).safe_then([this, &t
, lo
, len
](auto&& extent
) {
53 return extent
->find_lextent(get_ext_context(t
), lo
, len
);
54 }).safe_then([](auto &&e
) {
55 logger().debug("{}: found_lextent {}", __func__
, e
);
56 return find_lextent_ret(
57 find_lextent_ertr::ready_future_marker
{},
63 BtreeExtentMapManager::add_lextent_ret
64 BtreeExtentMapManager::add_lextent(extmap_root_t
&extmap_root
, Transaction
&t
,
65 objaddr_t lo
, lext_map_val_t val
)
67 logger().debug("{}: {}, {}, {}", __func__
, lo
, val
.laddr
, val
.length
);
68 return get_extmap_root(extmap_root
, t
).safe_then([this, &extmap_root
, &t
, lo
, val
](auto &&root
) {
69 return insert_lextent(extmap_root
, t
, root
, lo
, val
);
70 }).safe_then([](auto ret
) {
71 logger().debug("{}: {}", __func__
, ret
);
72 return add_lextent_ret(
73 add_lextent_ertr::ready_future_marker
{},
79 BtreeExtentMapManager::insert_lextent_ret
80 BtreeExtentMapManager::insert_lextent(extmap_root_t
&extmap_root
, Transaction
&t
,
81 ExtMapNodeRef root
, objaddr_t logical_offset
, lext_map_val_t val
)
83 auto split
= insert_lextent_ertr::make_ready_future
<ExtMapNodeRef
>(root
);
84 if (root
->at_max_capacity()) {
85 logger().debug("{}::splitting root {}", __func__
, *root
);
86 split
= root
->extmap_alloc_extent
<ExtMapInnerNode
>(get_ext_context(t
), EXTMAP_BLOCK_SIZE
)
87 .safe_then([this, &extmap_root
, root
, &t
, logical_offset
](auto&& nroot
) {
88 extmap_node_meta_t meta
{root
->get_node_meta().depth
+ 1};
89 nroot
->set_meta(meta
);
90 nroot
->journal_insert(nroot
->begin(), OBJ_ADDR_MIN
,
91 root
->get_laddr(), nullptr);
92 extmap_root
.extmap_root_laddr
= nroot
->get_laddr();
93 extmap_root
.depth
= root
->get_node_meta().depth
+ 1;
94 extmap_root
.state
= extmap_root_state_t::MUTATED
;
95 return nroot
->split_entry(get_ext_context(t
), logical_offset
, nroot
->begin(), root
);
98 return split
.safe_then([this, &t
, logical_offset
, val
](ExtMapNodeRef node
) {
99 return node
->insert(get_ext_context(t
), logical_offset
, val
);
103 BtreeExtentMapManager::rm_lextent_ret
104 BtreeExtentMapManager::rm_lextent(extmap_root_t
&extmap_root
, Transaction
&t
, objaddr_t lo
, lext_map_val_t val
)
106 logger().debug("{}: {}, {}, {}", __func__
, lo
, val
.laddr
, val
.length
);
107 return get_extmap_root(extmap_root
, t
).safe_then([this, &t
, lo
, val
](auto extent
) {
108 return extent
->rm_lextent(get_ext_context(t
), lo
, val
);
109 }).safe_then([](auto removed
) {
110 logger().debug("{}: {}", __func__
, removed
);
111 return rm_lextent_ret(
112 rm_lextent_ertr::ready_future_marker
{},