Skip to content

Commit f578d35

Browse files
zhscnMatan-B
authored andcommitted
crimson/os/seastore/BtreeLBAManager: refactor with LBACursorRef
Signed-off-by: Zhang Song <[email protected]> (cherry picked from commit 0751f1a)
1 parent aa46a61 commit f578d35

File tree

2 files changed

+80
-83
lines changed

2 files changed

+80
-83
lines changed

src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc

Lines changed: 73 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -132,38 +132,34 @@ BtreeLBAManager::get_mappings(
132132
LOG_PREFIX(BtreeLBAManager::get_mappings);
133133
TRACET("{}~0x{:x} ...", t, laddr, length);
134134
auto c = get_context(t);
135-
return with_btree_state<LBABtree, lba_pin_list_t>(
135+
return with_btree_state<LBABtree, lba_mapping_list_t>(
136136
cache, c,
137137
[FNAME, this, c, laddr, length](auto& btree, auto& ret)
138138
{
139-
return _get_mappings(c, btree, laddr, length
140-
).si_then([FNAME, this, c, laddr, length, &btree, &ret](auto pin_list) {
139+
return get_cursors(c, btree, laddr, length
140+
).si_then([FNAME, this, c, laddr, length, &btree, &ret](auto cursors) {
141141
return seastar::do_with(
142-
std::move(pin_list),
143-
[FNAME, this, c, laddr, length, &btree, &ret](auto& pin_list)
142+
std::move(cursors),
143+
[FNAME, this, c, laddr, length, &btree, &ret](auto& cursors)
144144
{
145145
return trans_intr::do_for_each(
146-
pin_list,
147-
[FNAME, this, c, laddr, length, &btree, &ret](auto& pin)
146+
cursors,
147+
[FNAME, this, c, laddr, length, &btree, &ret](auto& cursor)
148148
{
149-
if (!pin->is_indirect()) {
150-
TRACET("{}~0x{:x} got direct pin {}~0x{:x}",
151-
c.trans, laddr, length, pin->get_key(), pin->get_length());
152-
ret.emplace_back(std::move(pin));
149+
if (!cursor->is_indirect()) {
150+
ret.emplace_back(LBAMapping::create_direct(std::move(cursor)));
151+
TRACET("{}~0x{:x} got {}",
152+
c.trans, laddr, length, ret.back());
153153
return get_mappings_iertr::now();
154154
}
155-
auto key = pin->get_key();
156-
auto intermediate_key = pin->get_raw_val().get_laddr();
157-
auto intermediate_len = pin->get_length();
158-
return get_indirect_pin(c, btree, key, intermediate_key, intermediate_len
159-
).si_then([FNAME, c, &ret, laddr, length](auto pin) {
160-
TRACET("{}~0x{:x} got indirect pin {}~0x{:x}->{}({}~0x{:x})",
161-
c.trans, laddr, length,
162-
pin->get_key(), pin->get_length(),
163-
pin->get_intermediate_key(),
164-
pin->get_intermediate_base(),
165-
pin->get_intermediate_length());
166-
ret.emplace_back(std::move(pin));
155+
assert(cursor->val->refcount == EXTENT_DEFAULT_REF_COUNT);
156+
assert(cursor->val->checksum == 0);
157+
return resolve_indirect_cursor(c, btree, *cursor
158+
).si_then([FNAME, c, &ret, &cursor, laddr, length](auto direct) {
159+
ret.emplace_back(LBAMapping::create_indirect(
160+
std::move(direct), std::move(cursor)));
161+
TRACET("{}~0x{:x} got {}",
162+
c.trans, laddr, length, ret.back());
167163
return get_mappings_iertr::now();
168164
});
169165
});
@@ -172,17 +168,17 @@ BtreeLBAManager::get_mappings(
172168
});
173169
}
174170

175-
BtreeLBAManager::_get_mappings_ret
176-
BtreeLBAManager::_get_mappings(
171+
BtreeLBAManager::_get_cursors_ret
172+
BtreeLBAManager::get_cursors(
177173
op_context_t c,
178174
LBABtree& btree,
179175
laddr_t laddr,
180176
extent_len_t length)
181177
{
182-
LOG_PREFIX(BtreeLBAManager::_get_mappings);
178+
LOG_PREFIX(BtreeLBAManager::get_cursors);
183179
TRACET("{}~0x{:x} ...", c.trans, laddr, length);
184180
return seastar::do_with(
185-
std::list<BtreeLBAMappingRef>(),
181+
std::list<LBACursorRef>(),
186182
[FNAME, c, laddr, length, &btree](auto& ret)
187183
{
188184
return LBABtree::iterate_repeat(
@@ -191,16 +187,16 @@ BtreeLBAManager::_get_mappings(
191187
[FNAME, c, laddr, length, &ret](auto& pos)
192188
{
193189
if (pos.is_end() || pos.get_key() >= (laddr + length)) {
194-
TRACET("{}~0x{:x} done with {} results",
195-
c.trans, laddr, length, ret.size());
190+
TRACET("{}~0x{:x} done with {} results, stop at {}",
191+
c.trans, laddr, length, ret.size(), pos);
196192
return LBABtree::iterate_repeat_ret_inner(
197193
interruptible::ready_future_marker{},
198194
seastar::stop_iteration::yes);
199195
}
200-
TRACET("{}~0x{:x} got {}, {}, repeat ...",
201-
c.trans, laddr, length, pos.get_key(), pos.get_val());
196+
TRACET("{}~0x{:x} got {}, repeat ...",
197+
c.trans, laddr, length, pos);
202198
ceph_assert((pos.get_key() + pos.get_val().len) > laddr);
203-
ret.push_back(pos.get_pin(c));
199+
ret.emplace_back(pos.get_cursor(c));
204200
return LBABtree::iterate_repeat_ret_inner(
205201
interruptible::ready_future_marker{},
206202
seastar::stop_iteration::no);
@@ -210,25 +206,27 @@ BtreeLBAManager::_get_mappings(
210206
});
211207
}
212208

213-
BtreeLBAManager::get_indirect_pin_ret
214-
BtreeLBAManager::get_indirect_pin(
209+
BtreeLBAManager::resolve_indirect_cursor_ret
210+
BtreeLBAManager::resolve_indirect_cursor(
215211
op_context_t c,
216212
LBABtree& btree,
217-
laddr_t key,
218-
laddr_t intermediate_key,
219-
extent_len_t length)
213+
const LBACursor &indirect_cursor)
220214
{
221-
return _get_mappings(c, btree, intermediate_key, length
222-
).si_then([key, intermediate_key, length](auto pin_list) {
223-
ceph_assert(pin_list.size() == 1);
224-
auto& pin = pin_list.front();
225-
assert(!pin->is_indirect());
226-
assert(pin->get_key() <= intermediate_key);
227-
assert(pin->get_key() + pin->get_length() >= intermediate_key + length);
228-
pin->make_indirect(key, length, intermediate_key);
229-
assert(pin->get_key() == key);
230-
assert(pin->get_length() == length);
231-
return std::move(pin);
215+
ceph_assert(indirect_cursor.is_indirect());
216+
return get_cursors(
217+
c,
218+
btree,
219+
indirect_cursor.get_intermediate_key(),
220+
indirect_cursor.get_length()
221+
).si_then([&indirect_cursor](auto cursors) {
222+
ceph_assert(cursors.size() == 1);
223+
auto& direct_cursor = cursors.front();
224+
auto intermediate_key = indirect_cursor.get_intermediate_key();
225+
assert(!direct_cursor->is_indirect());
226+
assert(direct_cursor->get_laddr() <= intermediate_key);
227+
assert(direct_cursor->get_laddr() + direct_cursor->get_length()
228+
>= intermediate_key + indirect_cursor.get_length());
229+
return std::move(direct_cursor);
232230
});
233231
}
234232

@@ -240,54 +238,55 @@ BtreeLBAManager::get_mapping(
240238
LOG_PREFIX(BtreeLBAManager::get_mapping);
241239
TRACET("{} ...", t, laddr);
242240
auto c = get_context(t);
243-
return with_btree_ret<LBABtree, LBAMappingRef>(
241+
return with_btree<LBABtree>(
244242
cache, c,
245243
[FNAME, this, c, laddr](auto& btree)
246244
{
247-
return _get_mapping(c, btree, laddr
248-
).si_then([FNAME, this, c, laddr, &btree](auto pin) {
249-
if (!pin->is_indirect()) {
250-
TRACET("{} got direct pin len 0x{:x}",
251-
c.trans, laddr, pin->get_length());
252-
return get_mapping_iertr::make_ready_future<LBAMappingRef>(std::move(pin));
245+
return get_cursor(c, btree, laddr
246+
).si_then([FNAME, this, c, laddr, &btree](LBACursorRef cursor) {
247+
if (!cursor->is_indirect()) {
248+
TRACET("{} got direct cursor {}",
249+
c.trans, laddr, *cursor);
250+
auto mapping = LBAMapping::create_direct(std::move(cursor));
251+
return get_mapping_iertr::make_ready_future<
252+
LBAMapping>(std::move(mapping));
253253
}
254-
assert(laddr == pin->get_key());
255-
auto len = pin->get_length();
256-
laddr_t direct_laddr = pin->get_raw_val().get_laddr();
257-
return get_indirect_pin(c, btree, laddr, direct_laddr, len
258-
).si_then([FNAME, c, laddr](auto pin) {
259-
TRACET("{} got indirect pin {}~0x{:x}->{}({}~0x{:x})",
260-
c.trans, laddr,
261-
pin->get_key(), pin->get_length(),
262-
pin->get_intermediate_key(),
263-
pin->get_intermediate_base(),
264-
pin->get_intermediate_length());
265-
return get_mapping_iertr::make_ready_future<LBAMappingRef>(std::move(pin));
254+
assert(laddr == cursor->get_laddr());
255+
assert(cursor->val->refcount == EXTENT_DEFAULT_REF_COUNT);
256+
assert(cursor->val->checksum == 0);
257+
return resolve_indirect_cursor(c, btree, *cursor
258+
).si_then([FNAME, c, laddr, indirect=std::move(cursor)]
259+
(auto direct) mutable {
260+
auto mapping = LBAMapping::create_indirect(
261+
std::move(direct), std::move(indirect));
262+
TRACET("{} got indirect mapping {}",
263+
c.trans, laddr, mapping);
264+
return get_mapping_iertr::make_ready_future<
265+
LBAMapping>(std::move(mapping));
266266
});
267267
});
268268
});
269269
}
270270

271-
BtreeLBAManager::_get_mapping_ret
272-
BtreeLBAManager::_get_mapping(
271+
BtreeLBAManager::_get_cursor_ret
272+
BtreeLBAManager::get_cursor(
273273
op_context_t c,
274274
LBABtree& btree,
275275
laddr_t laddr)
276276
{
277-
LOG_PREFIX(BtreeLBAManager::_get_mapping);
277+
LOG_PREFIX(BtreeLBAManager::get_cursor);
278278
TRACET("{} ...", c.trans, laddr);
279279
return btree.lower_bound(
280280
c, laddr
281-
).si_then([FNAME, c, laddr](auto iter) -> _get_mapping_ret {
281+
).si_then([FNAME, c, laddr](auto iter) -> _get_cursor_ret {
282282
if (iter.is_end() || iter.get_key() != laddr) {
283283
ERRORT("{} doesn't exist", c.trans, laddr);
284284
return crimson::ct_error::enoent::make();
285285
}
286286
TRACET("{} got value {}", c.trans, laddr, iter.get_val());
287-
auto e = iter.get_pin(c);
288-
return _get_mapping_ret(
287+
return _get_cursor_ret(
289288
interruptible::ready_future_marker{},
290-
std::move(e));
289+
iter.get_cursor(c));
291290
});
292291
}
293292

src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -562,26 +562,24 @@ class BtreeLBAManager : public LBAManager {
562562
});
563563
}
564564

565-
using _get_mapping_ret = get_mapping_iertr::future<BtreeLBAMappingRef>;
566-
_get_mapping_ret _get_mapping(
565+
using _get_cursor_ret = get_mapping_iertr::future<LBACursorRef>;
566+
_get_cursor_ret get_cursor(
567567
op_context_t c,
568568
LBABtree& btree,
569569
laddr_t offset);
570570

571-
using _get_mappings_ret = get_mappings_iertr::future<std::list<BtreeLBAMappingRef>>;
572-
_get_mappings_ret _get_mappings(
571+
using _get_cursors_ret = get_mappings_iertr::future<std::list<LBACursorRef>>;
572+
_get_cursors_ret get_cursors(
573573
op_context_t c,
574574
LBABtree& btree,
575575
laddr_t offset,
576576
extent_len_t length);
577577

578-
using get_indirect_pin_ret = get_mappings_iertr::future<BtreeLBAMappingRef>;
579-
get_indirect_pin_ret get_indirect_pin(
578+
using resolve_indirect_cursor_ret = get_mappings_iertr::future<LBACursorRef>;
579+
resolve_indirect_cursor_ret resolve_indirect_cursor(
580580
op_context_t c,
581581
LBABtree& btree,
582-
laddr_t key,
583-
laddr_t intermediate_key,
584-
extent_len_t length);
582+
const LBACursor& indirect_cursor);
585583

586584
using _decref_intermediate_ret = ref_iertr::future<
587585
std::optional<ref_update_result_t>>;

0 commit comments

Comments
 (0)