Skip to content

Commit 3fc1a3b

Browse files
authored
Merge pull request ceph#63432 from Matan-B/wip-matanb-crimson-tentacle-62071
crimson/os/seastore: tentacle: introduce BtreeCursor to simplify the implementation of LBAMapping/BackrefMapping Reviewed-by: Yingxin Cheng <[email protected]>
2 parents 1563647 + c6a5554 commit 3fc1a3b

40 files changed

+2842
-2700
lines changed

src/crimson/os/seastore/CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ set(crimson_seastore_srcs
1212
root_block.cc
1313
lba_manager.cc
1414
async_cleaner.cc
15+
btree/btree_types.cc
1516
backref_manager.cc
16-
backref/backref_tree_node.cc
1717
backref/btree_backref_manager.cc
18-
lba_manager/btree/btree_lba_manager.cc
19-
lba_manager/btree/lba_btree_node.cc
18+
lba/btree_lba_manager.cc
19+
lba/lba_btree_node.cc
2020
omap_manager.cc
2121
omap_manager/btree/btree_omap_manager.cc
2222
omap_manager/btree/omap_btree_node_impl.cc

src/crimson/os/seastore/async_cleaner.cc

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1091,7 +1091,7 @@ double SegmentCleaner::calc_gc_benefit_cost(
10911091
SegmentCleaner::do_reclaim_space_ret
10921092
SegmentCleaner::do_reclaim_space(
10931093
const std::vector<CachedExtentRef> &backref_extents,
1094-
const backref_pin_list_t &pin_list,
1094+
const backref_mapping_list_t &pin_list,
10951095
std::size_t &reclaimed,
10961096
std::size_t &runs)
10971097
{
@@ -1142,10 +1142,10 @@ SegmentCleaner::do_reclaim_space(
11421142
backref_entry_query_set_t backref_entries;
11431143
for (auto &pin : pin_list) {
11441144
backref_entries.emplace(
1145-
pin->get_key(),
1146-
pin->get_val(),
1147-
pin->get_length(),
1148-
pin->get_type());
1145+
pin.get_key(),
1146+
pin.get_val(),
1147+
pin.get_length(),
1148+
pin.get_type());
11491149
}
11501150
for (auto &cached_backref : cached_backref_entries) {
11511151
if (cached_backref.laddr == L_ADDR_NULL) {
@@ -1236,7 +1236,7 @@ SegmentCleaner::clean_space_ret SegmentCleaner::clean_space()
12361236
// transactions. So, concurrent transactions between trim and reclaim are
12371237
// not allowed right now.
12381238
return seastar::do_with(
1239-
std::pair<std::vector<CachedExtentRef>, backref_pin_list_t>(),
1239+
std::pair<std::vector<CachedExtentRef>, backref_mapping_list_t>(),
12401240
[this](auto &weak_read_ret) {
12411241
return repeat_eagain([this, &weak_read_ret] {
12421242
// Note: not tracked by shard_stats_t intentionally.
@@ -1253,7 +1253,7 @@ SegmentCleaner::clean_space_ret SegmentCleaner::clean_space()
12531253
if (!pin_list.empty()) {
12541254
auto it = pin_list.begin();
12551255
auto &first_pin = *it;
1256-
if (first_pin->get_key() < reclaim_state->start_pos) {
1256+
if (first_pin.get_key() < reclaim_state->start_pos) {
12571257
// BackrefManager::get_mappings may include a entry before
12581258
// reclaim_state->start_pos, which is semantically inconsistent
12591259
// with the requirements of the cleaner

src/crimson/os/seastore/async_cleaner.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1487,7 +1487,7 @@ class SegmentCleaner : public SegmentProvider, public AsyncCleaner {
14871487
using do_reclaim_space_ret = do_reclaim_space_ertr::future<>;
14881488
do_reclaim_space_ret do_reclaim_space(
14891489
const std::vector<CachedExtentRef> &backref_extents,
1490-
const backref_pin_list_t &pin_list,
1490+
const backref_mapping_list_t &pin_list,
14911491
std::size_t &reclaimed,
14921492
std::size_t &runs);
14931493

src/crimson/os/seastore/backref/backref_tree_node.cc

Lines changed: 0 additions & 14 deletions
This file was deleted.

src/crimson/os/seastore/backref/backref_tree_node.h

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -44,42 +44,6 @@ constexpr size_t LEAF_NODE_CAPACITY = 193;
4444

4545
using BackrefNode = FixedKVNode<paddr_t>;
4646

47-
struct backref_map_val_t {
48-
extent_len_t len = 0; ///< length of extents
49-
laddr_t laddr = L_ADDR_MIN; ///< logical address of extents
50-
extent_types_t type = extent_types_t::ROOT;
51-
52-
backref_map_val_t() = default;
53-
backref_map_val_t(
54-
extent_len_t len,
55-
laddr_t laddr,
56-
extent_types_t type)
57-
: len(len), laddr(laddr), type(type) {}
58-
59-
bool operator==(const backref_map_val_t& rhs) const noexcept {
60-
return len == rhs.len && laddr == rhs.laddr;
61-
}
62-
};
63-
64-
std::ostream& operator<<(std::ostream &out, const backref_map_val_t& val);
65-
66-
struct __attribute__((packed)) backref_map_val_le_t {
67-
extent_len_le_t len = init_extent_len_le(0);
68-
laddr_le_t laddr = laddr_le_t(L_ADDR_MIN);
69-
extent_types_le_t type = 0;
70-
71-
backref_map_val_le_t() = default;
72-
backref_map_val_le_t(const backref_map_val_le_t &) = default;
73-
explicit backref_map_val_le_t(const backref_map_val_t &val)
74-
: len(init_extent_len_le(val.len)),
75-
laddr(val.laddr),
76-
type(extent_types_le_t(val.type)) {}
77-
78-
operator backref_map_val_t() const {
79-
return backref_map_val_t{len, laddr, (extent_types_t)type};
80-
}
81-
};
82-
8347
class BackrefInternalNode
8448
: public FixedKVInternalNode<
8549
INTERNAL_NODE_CAPACITY,

src/crimson/os/seastore/backref/btree_backref_manager.cc

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ phy_tree_root_t& get_phy_tree_root<
2222
template<>
2323
const get_phy_tree_root_node_ret get_phy_tree_root_node<
2424
crimson::os::seastore::backref::BackrefBtree>(
25-
const RootBlockRef &root_block, op_context_t<paddr_t> c) {
25+
const RootBlockRef &root_block, op_context_t c) {
2626
auto backref_root = root_block->backref_root_node;
2727
if (backref_root) {
2828
ceph_assert(backref_root->is_initial_pending()
@@ -91,7 +91,7 @@ BtreeBackrefManager::get_mapping(
9191
LOG_PREFIX(BtreeBackrefManager::get_mapping);
9292
TRACET("{}", t, offset);
9393
auto c = get_context(t);
94-
return with_btree_ret<BackrefBtree, BackrefMappingRef>(
94+
return with_btree<BackrefBtree>(
9595
cache,
9696
c,
9797
[c, offset](auto &btree) {
@@ -107,7 +107,7 @@ BtreeBackrefManager::get_mapping(
107107
c.trans, offset, iter.get_key(), iter.get_val());
108108
return get_mapping_ret(
109109
interruptible::ready_future_marker{},
110-
iter.get_pin(c));
110+
BackrefMapping::create(iter.get_cursor(c)));
111111
}
112112
});
113113
});
@@ -122,7 +122,7 @@ BtreeBackrefManager::get_mappings(
122122
LOG_PREFIX(BtreeBackrefManager::get_mappings);
123123
TRACET("{}~{}", t, offset, end);
124124
auto c = get_context(t);
125-
return with_btree_state<BackrefBtree, backref_pin_list_t>(
125+
return with_btree_state<BackrefBtree, backref_mapping_list_t>(
126126
cache,
127127
c,
128128
[c, offset, end](auto &btree, auto &ret) {
@@ -141,7 +141,7 @@ BtreeBackrefManager::get_mappings(
141141
TRACET("{}~{} got {}, {}, repeat ...",
142142
c.trans, offset, end, pos.get_key(), pos.get_val());
143143
ceph_assert((pos.get_key().add_offset(pos.get_val().len)) > offset);
144-
ret.emplace_back(pos.get_pin(c));
144+
ret.emplace_back(BackrefMapping::create(pos.get_cursor(c)));
145145
return BackrefBtree::iterate_repeat_ret_inner(
146146
interruptible::ready_future_marker{},
147147
seastar::stop_iteration::no);
@@ -237,8 +237,8 @@ BtreeBackrefManager::new_mapping(
237237
});
238238
});
239239
}).si_then([c](auto &&state) {
240-
return new_mapping_iertr::make_ready_future<BackrefMappingRef>(
241-
state.ret->get_pin(c));
240+
return new_mapping_iertr::make_ready_future<BackrefMapping>(
241+
BackrefMapping::create(state.ret->get_cursor(c)));
242242
});
243243
}
244244

@@ -455,7 +455,7 @@ BtreeBackrefManager::scan_mapped_space(
455455
}
456456

457457
BtreeBackrefManager::base_iertr::future<> _init_cached_extent(
458-
op_context_t<paddr_t> c,
458+
op_context_t c,
459459
const CachedExtentRef &e,
460460
BackrefBtree &btree,
461461
bool &ret)
@@ -503,7 +503,7 @@ BtreeBackrefManager::remove_mapping(
503503
paddr_t addr)
504504
{
505505
auto c = get_context(t);
506-
return with_btree_ret<BackrefBtree, remove_mapping_result_t>(
506+
return with_btree<BackrefBtree>(
507507
cache,
508508
c,
509509
[c, addr](auto &btree) mutable {
@@ -574,7 +574,7 @@ BtreeBackrefManager::retrieve_backref_extents_in_range(
574574
ent.key);
575575

576576
auto c = get_context(t);
577-
return with_btree_ret<BackrefBtree, CachedExtentRef>(
577+
return with_btree<BackrefBtree>(
578578
cache,
579579
c,
580580
[c, &ent](auto &btree) {

src/crimson/os/seastore/backref/btree_backref_manager.h

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,31 +9,11 @@
99

1010
namespace crimson::os::seastore::backref {
1111

12-
class BtreeBackrefMapping : public BackrefMapping {
13-
public:
14-
BtreeBackrefMapping(op_context_t<paddr_t> ctx)
15-
: BackrefMapping(ctx) {}
16-
BtreeBackrefMapping(
17-
op_context_t<paddr_t> ctx,
18-
BackrefLeafNodeRef parent,
19-
uint16_t pos,
20-
backref_map_val_t &val,
21-
backref_node_meta_t &&meta)
22-
: BackrefMapping(
23-
val.type,
24-
ctx,
25-
parent,
26-
pos,
27-
val.laddr,
28-
val.len,
29-
std::forward<backref_node_meta_t>(meta)) {}
30-
};
31-
3212
constexpr size_t BACKREF_BLOCK_SIZE = 4096;
3313

3414
using BackrefBtree = FixedKVBtree<
3515
paddr_t, backref_map_val_t, BackrefInternalNode,
36-
BackrefLeafNode, BtreeBackrefMapping, BACKREF_BLOCK_SIZE>;
16+
BackrefLeafNode, BackrefCursor, BACKREF_BLOCK_SIZE>;
3717

3818
class BtreeBackrefManager : public BackrefManager {
3919
public:
@@ -101,8 +81,8 @@ class BtreeBackrefManager : public BackrefManager {
10181
private:
10282
Cache &cache;
10383

104-
op_context_t<paddr_t> get_context(Transaction &t) {
105-
return op_context_t<paddr_t>{cache, t};
84+
op_context_t get_context(Transaction &t) {
85+
return op_context_t{cache, t};
10686
}
10787
};
10888

src/crimson/os/seastore/backref_manager.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class BackrefManager {
3030
* Future will not resolve until all pins have resolved
3131
*/
3232
using get_mappings_iertr = base_iertr;
33-
using get_mappings_ret = get_mappings_iertr::future<backref_pin_list_t>;
33+
using get_mappings_ret = get_mappings_iertr::future<backref_mapping_list_t>;
3434
virtual get_mappings_ret get_mappings(
3535
Transaction &t,
3636
paddr_t offset,
@@ -43,7 +43,7 @@ class BackrefManager {
4343
*/
4444
using get_mapping_iertr = base_iertr::extend<
4545
crimson::ct_error::enoent>;
46-
using get_mapping_ret = get_mapping_iertr::future<BackrefMappingRef>;
46+
using get_mapping_ret = get_mapping_iertr::future<BackrefMapping>;
4747
virtual get_mapping_ret get_mapping(
4848
Transaction &t,
4949
paddr_t offset) = 0;
@@ -63,7 +63,7 @@ class BackrefManager {
6363
* Insert new paddr_t -> laddr_t mapping
6464
*/
6565
using new_mapping_iertr = base_iertr;
66-
using new_mapping_ret = new_mapping_iertr::future<BackrefMappingRef>;
66+
using new_mapping_ret = new_mapping_iertr::future<BackrefMapping>;
6767
virtual new_mapping_ret new_mapping(
6868
Transaction &t,
6969
paddr_t key,

src/crimson/os/seastore/backref_mapping.h

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,57 @@
33

44
#pragma once
55

6-
#include "crimson/os/seastore/btree/btree_range_pin.h"
6+
#include "crimson/os/seastore/btree/btree_types.h"
77

88
namespace crimson::os::seastore {
99

10-
class BackrefMapping : public BtreeNodeMapping<paddr_t, laddr_t> {
11-
extent_types_t type;
10+
class BackrefMapping {
11+
BackrefCursorRef cursor;
12+
13+
BackrefMapping(BackrefCursorRef cursor)
14+
: cursor(std::move(cursor)) {}
15+
1216
public:
13-
BackrefMapping(op_context_t<paddr_t> ctx)
14-
: BtreeNodeMapping(ctx) {}
15-
template <typename... T>
16-
BackrefMapping(extent_types_t type, T&&... t)
17-
: BtreeNodeMapping(std::forward<T>(t)...),
18-
type(type) {}
17+
static BackrefMapping create(BackrefCursorRef cursor) {
18+
return BackrefMapping(std::move(cursor));
19+
}
20+
21+
BackrefMapping() = default;
22+
23+
BackrefMapping(const BackrefMapping &) = delete;
24+
BackrefMapping(BackrefMapping &&) = default;
25+
26+
BackrefMapping &operator=(const BackrefMapping &) = delete;
27+
BackrefMapping &operator=(BackrefMapping &&) = default;
28+
29+
~BackrefMapping() = default;
30+
31+
bool is_viewable() const {
32+
assert(cursor);
33+
return cursor->is_viewable();
34+
}
35+
36+
extent_len_t get_length() const {
37+
assert(cursor);
38+
return cursor->get_length();
39+
}
40+
41+
laddr_t get_val() const {
42+
assert(cursor);
43+
return cursor->get_laddr();
44+
}
45+
46+
paddr_t get_key() const {
47+
assert(cursor);
48+
return cursor->get_paddr();
49+
}
50+
1951
extent_types_t get_type() const {
20-
return type;
52+
assert(cursor);
53+
return cursor->get_type();
2154
}
2255
};
2356

24-
using BackrefMappingRef = std::unique_ptr<BackrefMapping>;
25-
using backref_pin_list_t = std::list<BackrefMappingRef>;
57+
using backref_mapping_list_t = std::list<BackrefMapping>;
2658

2759
} // namespace crimson::os::seastore

0 commit comments

Comments
 (0)