]> git.proxmox.com Git - ceph.git/blob - ceph/src/crimson/os/seastore/extentmap_manager/btree/btree_extentmap_manager.cc
buildsys: switch source download to quincy
[ceph.git] / ceph / src / crimson / os / seastore / extentmap_manager / btree / btree_extentmap_manager.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3 #include <sys/mman.h>
4 #include <string.h>
5
6 #include "crimson/common/log.h"
7
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"
11
12 namespace {
13 seastar::logger& logger() {
14 return crimson::get_logger(ceph_subsys_filestore);
15 }
16 }
17
18 namespace crimson::os::seastore::extentmap_manager {
19
20 BtreeExtentMapManager::BtreeExtentMapManager(
21 TransactionManager &tm)
22 : tm(tm) {}
23
24 BtreeExtentMapManager::initialize_extmap_ret
25 BtreeExtentMapManager::initialize_extmap(Transaction &t)
26 {
27
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);
36 });
37 }
38
39 BtreeExtentMapManager::get_root_ret
40 BtreeExtentMapManager::get_extmap_root(const extmap_root_t &extmap_root, Transaction &t)
41 {
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);
45 }
46
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)
50 {
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{},
58 std::move(e));
59 });
60
61 }
62
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)
66 {
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{},
74 std::move(ret));
75 });
76
77 }
78
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)
82 {
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);
96 });
97 }
98 return split.safe_then([this, &t, logical_offset, val](ExtMapNodeRef node) {
99 return node->insert(get_ext_context(t), logical_offset, val);
100 });
101 }
102
103 BtreeExtentMapManager::rm_lextent_ret
104 BtreeExtentMapManager::rm_lextent(extmap_root_t &extmap_root, Transaction &t, objaddr_t lo, lext_map_val_t val)
105 {
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{},
113 removed);
114 });
115 }
116
117
118 }