Skip to content

Commit 6de0522

Browse files
committed
crimson/os/seastore/../btree_lba_manager: rework get_mapping(s)
Remove the unnecessary recursion to simplify the implementations. Signed-off-by: Yingxin Cheng <[email protected]>
1 parent a31460e commit 6de0522

File tree

2 files changed

+121
-129
lines changed

2 files changed

+121
-129
lines changed

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

Lines changed: 114 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -147,96 +147,89 @@ BtreeLBAManager::mkfs(
147147
BtreeLBAManager::get_mappings_ret
148148
BtreeLBAManager::get_mappings(
149149
Transaction &t,
150-
laddr_t offset, extent_len_t length)
150+
laddr_t laddr,
151+
extent_len_t length)
151152
{
152153
LOG_PREFIX(BtreeLBAManager::get_mappings);
153-
TRACET("{}~{}", t, offset, length);
154+
TRACET("{}~0x{:x} ...", t, laddr, length);
154155
auto c = get_context(t);
155156
return with_btree_state<LBABtree, lba_pin_list_t>(
156-
cache,
157-
c,
158-
[c, offset, length, FNAME, this](auto &btree, auto &ret) {
157+
cache, c,
158+
[FNAME, this, c, laddr, length](auto& btree, auto& ret)
159+
{
160+
return _get_mappings(c, btree, laddr, length
161+
).si_then([FNAME, this, c, laddr, length, &btree, &ret](auto pin_list) {
159162
return seastar::do_with(
160-
std::list<BtreeLBAMappingRef>(),
161-
[offset, length, c, FNAME, this, &ret, &btree](auto &pin_list) {
162-
return LBABtree::iterate_repeat(
163-
c,
164-
btree.upper_bound_right(c, offset),
165-
[&pin_list, offset, length, c, FNAME](auto &pos) {
166-
if (pos.is_end() || pos.get_key() >= (offset + length)) {
167-
TRACET("{}~{} done with {} results",
168-
c.trans, offset, length, pin_list.size());
169-
return LBABtree::iterate_repeat_ret_inner(
170-
interruptible::ready_future_marker{},
171-
seastar::stop_iteration::yes);
172-
}
173-
TRACET("{}~{} got {}, {}, repeat ...",
174-
c.trans, offset, length, pos.get_key(), pos.get_val());
175-
ceph_assert((pos.get_key() + pos.get_val().len) > offset);
176-
pin_list.push_back(pos.get_pin(c));
177-
return LBABtree::iterate_repeat_ret_inner(
178-
interruptible::ready_future_marker{},
179-
seastar::stop_iteration::no);
180-
}).si_then([this, &ret, c, &pin_list] {
181-
return _get_original_mappings(c, pin_list
182-
).si_then([&ret](auto _ret) {
183-
ret = std::move(_ret);
184-
});
185-
});
186-
});
163+
std::move(pin_list),
164+
[FNAME, this, c, laddr, length, &btree, &ret](auto& pin_list)
165+
{
166+
return trans_intr::do_for_each(
167+
pin_list,
168+
[FNAME, this, c, laddr, length, &btree, &ret](auto& pin)
169+
{
170+
if (!pin->is_indirect()) {
171+
TRACET("{}~0x{:x} got direct pin {}~0x{:x}",
172+
c.trans, laddr, length, pin->get_key(), pin->get_length());
173+
ret.emplace_back(std::move(pin));
174+
return get_mappings_iertr::now();
175+
}
176+
auto key = pin->get_key();
177+
auto intermediate_key = pin->get_raw_val().get_laddr();
178+
auto intermediate_len = pin->get_length();
179+
return _get_mappings(c, btree, intermediate_key, intermediate_len
180+
).si_then([FNAME, c, laddr, length, key, intermediate_key,
181+
intermediate_len, &ret](auto pin_list) {
182+
ceph_assert(pin_list.size() == 1);
183+
auto& pin = pin_list.front();
184+
assert(!pin->is_indirect());
185+
assert(pin->get_key() <= intermediate_key);
186+
assert(pin->get_key() + pin->get_length() >= intermediate_key + intermediate_len);
187+
TRACET("{}~0x{:x} got indirect pin {}~0x{:x}->{}({}~0x{:x})",
188+
c.trans, laddr, length, key, intermediate_len, intermediate_key,
189+
pin->get_key(), pin->get_length());
190+
pin->make_indirect(key, intermediate_len, intermediate_key);
191+
ret.emplace_back(std::move(pin));
192+
return get_mappings_iertr::now();
193+
});
194+
});
195+
});
187196
});
197+
});
188198
}
189199

190-
BtreeLBAManager::_get_original_mappings_ret
191-
BtreeLBAManager::_get_original_mappings(
200+
BtreeLBAManager::_get_mappings_ret
201+
BtreeLBAManager::_get_mappings(
192202
op_context_t<laddr_t> c,
193-
std::list<BtreeLBAMappingRef> &pin_list)
203+
LBABtree& btree,
204+
laddr_t laddr,
205+
extent_len_t length)
194206
{
207+
LOG_PREFIX(BtreeLBAManager::_get_mappings);
208+
TRACET("{}~0x{:x} ...", c.trans, laddr, length);
195209
return seastar::do_with(
196-
lba_pin_list_t(),
197-
[this, c, &pin_list](auto &ret) {
198-
return trans_intr::do_for_each(
199-
pin_list,
200-
[this, c, &ret](auto &pin) {
201-
LOG_PREFIX(BtreeLBAManager::get_mappings);
202-
if (pin->get_raw_val().is_paddr()) {
203-
ret.emplace_back(std::move(pin));
204-
return get_mappings_iertr::now();
205-
}
206-
TRACET(
207-
"getting original mapping for indirect mapping {}~{}",
208-
c.trans, pin->get_key(), pin->get_length());
209-
return this->get_mappings(
210-
c.trans, pin->get_raw_val().get_laddr(), pin->get_length()
211-
).si_then([&pin, &ret, c](auto new_pin_list) {
212-
LOG_PREFIX(BtreeLBAManager::get_mappings);
213-
assert(new_pin_list.size() == 1);
214-
auto &new_pin = new_pin_list.front();
215-
auto intermediate_key = pin->get_raw_val().get_laddr();
216-
assert(!new_pin->is_indirect());
217-
assert(new_pin->get_key() <= intermediate_key);
218-
assert(new_pin->get_key() + new_pin->get_length() >=
219-
intermediate_key + pin->get_length());
220-
221-
TRACET("Got mapping {}~{} for indirect mapping {}~{}, "
222-
"intermediate_key {}",
223-
c.trans,
224-
new_pin->get_key(), new_pin->get_length(),
225-
pin->get_key(), pin->get_length(),
226-
pin->get_raw_val().get_laddr());
227-
auto &btree_new_pin = static_cast<BtreeLBAMapping&>(*new_pin);
228-
btree_new_pin.make_indirect(
229-
pin->get_key(),
230-
pin->get_length(),
231-
pin->get_raw_val().get_laddr());
232-
ret.emplace_back(std::move(new_pin));
233-
return seastar::now();
234-
}).handle_error_interruptible(
235-
crimson::ct_error::input_output_error::pass_further{},
236-
crimson::ct_error::assert_all("unexpected enoent")
237-
);
210+
std::list<BtreeLBAMappingRef>(),
211+
[FNAME, c, laddr, length, &btree](auto& ret)
212+
{
213+
return LBABtree::iterate_repeat(
214+
c,
215+
btree.upper_bound_right(c, laddr),
216+
[FNAME, c, laddr, length, &ret](auto& pos)
217+
{
218+
if (pos.is_end() || pos.get_key() >= (laddr + length)) {
219+
TRACET("{}~0x{:x} done with {} results",
220+
c.trans, laddr, length, ret.size());
221+
return LBABtree::iterate_repeat_ret_inner(
222+
interruptible::ready_future_marker{},
223+
seastar::stop_iteration::yes);
238224
}
239-
).si_then([&ret] {
225+
TRACET("{}~0x{:x} got {}, {}, repeat ...",
226+
c.trans, laddr, length, pos.get_key(), pos.get_val());
227+
ceph_assert((pos.get_key() + pos.get_val().len) > laddr);
228+
ret.push_back(pos.get_pin(c));
229+
return LBABtree::iterate_repeat_ret_inner(
230+
interruptible::ready_future_marker{},
231+
seastar::stop_iteration::no);
232+
}).si_then([&ret] {
240233
return std::move(ret);
241234
});
242235
});
@@ -245,62 +238,58 @@ BtreeLBAManager::_get_original_mappings(
245238
BtreeLBAManager::get_mapping_ret
246239
BtreeLBAManager::get_mapping(
247240
Transaction &t,
248-
laddr_t offset)
241+
laddr_t laddr)
249242
{
250243
LOG_PREFIX(BtreeLBAManager::get_mapping);
251-
TRACET("{}", t, offset);
252-
return _get_mapping(t, offset
253-
).si_then([](auto pin) {
254-
return get_mapping_iertr::make_ready_future<LBAMappingRef>(std::move(pin));
244+
TRACET("{} ...", t, laddr);
245+
auto c = get_context(t);
246+
return with_btree_ret<LBABtree, LBAMappingRef>(
247+
cache, c,
248+
[FNAME, this, c, laddr](auto& btree)
249+
{
250+
return _get_mapping(c, btree, laddr
251+
).si_then([FNAME, this, c, laddr, &btree](auto pin) {
252+
if (!pin->is_indirect()) {
253+
TRACET("{} got direct pin len 0x{:x}",
254+
c.trans, laddr, pin->get_length());
255+
return get_mapping_iertr::make_ready_future<LBAMappingRef>(std::move(pin));
256+
}
257+
assert(laddr == pin->get_key());
258+
auto len = pin->get_length();
259+
laddr_t direct_laddr = pin->get_raw_val().get_laddr();
260+
return _get_mapping(c, btree, direct_laddr
261+
).si_then([FNAME, c, laddr, len](auto pin) {
262+
ceph_assert(len == pin->get_length());
263+
TRACET("{} got indirect pin->{}~0x{:x}",
264+
c.trans, laddr, pin->get_key(), len);
265+
pin->make_indirect(laddr, len);
266+
return get_mapping_iertr::make_ready_future<LBAMappingRef>(std::move(pin));
267+
});
268+
});
255269
});
256270
}
257271

258272
BtreeLBAManager::_get_mapping_ret
259273
BtreeLBAManager::_get_mapping(
260-
Transaction &t,
261-
laddr_t offset)
274+
op_context_t<laddr_t> c,
275+
LBABtree& btree,
276+
laddr_t laddr)
262277
{
263278
LOG_PREFIX(BtreeLBAManager::_get_mapping);
264-
TRACET("{}", t, offset);
265-
auto c = get_context(t);
266-
return with_btree_ret<LBABtree, BtreeLBAMappingRef>(
267-
cache,
268-
c,
269-
[FNAME, c, offset, this](auto &btree) {
270-
return btree.lower_bound(
271-
c, offset
272-
).si_then([FNAME, offset, c](auto iter) -> _get_mapping_ret {
273-
if (iter.is_end() || iter.get_key() != offset) {
274-
ERRORT("laddr={} doesn't exist", c.trans, offset);
275-
return crimson::ct_error::enoent::make();
276-
} else {
277-
TRACET("{} got {}, {}",
278-
c.trans, offset, iter.get_key(), iter.get_val());
279-
auto e = iter.get_pin(c);
280-
return _get_mapping_ret(
281-
interruptible::ready_future_marker{},
282-
std::move(e));
283-
}
284-
}).si_then([this, c](auto pin) -> _get_mapping_ret {
285-
if (pin->get_raw_val().is_laddr()) {
286-
return seastar::do_with(
287-
std::move(pin),
288-
[this, c](auto &pin) {
289-
return _get_mapping(
290-
c.trans, pin->get_raw_val().get_laddr()
291-
).si_then([&pin](auto new_pin) {
292-
ceph_assert(pin->get_length() == new_pin->get_length());
293-
new_pin->make_indirect(
294-
pin->get_key(),
295-
pin->get_length());
296-
return new_pin;
297-
});
298-
});
299-
} else {
300-
return get_mapping_iertr::make_ready_future<BtreeLBAMappingRef>(std::move(pin));
301-
}
302-
});
303-
});
279+
TRACET("{} ...", c.trans, laddr);
280+
return btree.lower_bound(
281+
c, laddr
282+
).si_then([FNAME, c, laddr](auto iter) -> _get_mapping_ret {
283+
if (iter.is_end() || iter.get_key() != laddr) {
284+
ERRORT("{} doesn't exist", c.trans, laddr);
285+
return crimson::ct_error::enoent::make();
286+
}
287+
TRACET("{} got value {}", c.trans, laddr, iter.get_val());
288+
auto e = iter.get_pin(c);
289+
return _get_mapping_ret(
290+
interruptible::ready_future_marker{},
291+
std::move(e));
292+
});
304293
}
305294

306295
BtreeLBAManager::alloc_extents_ret

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -702,13 +702,16 @@ class BtreeLBAManager : public LBAManager {
702702

703703
using _get_mapping_ret = get_mapping_iertr::future<BtreeLBAMappingRef>;
704704
_get_mapping_ret _get_mapping(
705-
Transaction &t,
705+
op_context_t<laddr_t> c,
706+
LBABtree& btree,
706707
laddr_t offset);
707708

708-
using _get_original_mappings_ret = get_mappings_ret;
709-
_get_original_mappings_ret _get_original_mappings(
709+
using _get_mappings_ret = get_mappings_iertr::future<std::list<BtreeLBAMappingRef>>;
710+
_get_mappings_ret _get_mappings(
710711
op_context_t<laddr_t> c,
711-
std::list<BtreeLBAMappingRef> &pin_list);
712+
LBABtree& btree,
713+
laddr_t offset,
714+
extent_len_t length);
712715

713716
using _decref_intermediate_ret = ref_iertr::future<
714717
std::optional<ref_update_result_t>>;

0 commit comments

Comments
 (0)