Skip to content

Commit 1adc50f

Browse files
committed
crimson/os/seastore/../btree_lba_manager: get_mapping() to reuse get_indirect_pin()
There is no guarantee that the direct pin must match exactly. Signed-off-by: Yingxin Cheng <[email protected]>
1 parent 6de0522 commit 1adc50f

File tree

2 files changed

+45
-17
lines changed

2 files changed

+45
-17
lines changed

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

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -176,18 +176,14 @@ BtreeLBAManager::get_mappings(
176176
auto key = pin->get_key();
177177
auto intermediate_key = pin->get_raw_val().get_laddr();
178178
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);
179+
return get_indirect_pin(c, btree, key, intermediate_key, intermediate_len
180+
).si_then([FNAME, c, &ret, laddr, length](auto pin) {
187181
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);
182+
c.trans, laddr, length,
183+
pin->get_key(), pin->get_length(),
184+
pin->get_intermediate_key(),
185+
pin->get_intermediate_base(),
186+
pin->get_intermediate_length());
191187
ret.emplace_back(std::move(pin));
192188
return get_mappings_iertr::now();
193189
});
@@ -235,6 +231,28 @@ BtreeLBAManager::_get_mappings(
235231
});
236232
}
237233

234+
BtreeLBAManager::get_indirect_pin_ret
235+
BtreeLBAManager::get_indirect_pin(
236+
op_context_t<laddr_t> c,
237+
LBABtree& btree,
238+
laddr_t key,
239+
laddr_t intermediate_key,
240+
extent_len_t length)
241+
{
242+
return _get_mappings(c, btree, intermediate_key, length
243+
).si_then([key, intermediate_key, length](auto pin_list) {
244+
ceph_assert(pin_list.size() == 1);
245+
auto& pin = pin_list.front();
246+
assert(!pin->is_indirect());
247+
assert(pin->get_key() <= intermediate_key);
248+
assert(pin->get_key() + pin->get_length() >= intermediate_key + length);
249+
pin->make_indirect(key, length, intermediate_key);
250+
assert(pin->get_key() == key);
251+
assert(pin->get_length() == length);
252+
return std::move(pin);
253+
});
254+
}
255+
238256
BtreeLBAManager::get_mapping_ret
239257
BtreeLBAManager::get_mapping(
240258
Transaction &t,
@@ -257,12 +275,14 @@ BtreeLBAManager::get_mapping(
257275
assert(laddr == pin->get_key());
258276
auto len = pin->get_length();
259277
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);
278+
return get_indirect_pin(c, btree, laddr, direct_laddr, len
279+
).si_then([FNAME, c, laddr](auto pin) {
280+
TRACET("{} got indirect pin {}~0x{:x}->{}({}~0x{:x})",
281+
c.trans, laddr,
282+
pin->get_key(), pin->get_length(),
283+
pin->get_intermediate_key(),
284+
pin->get_intermediate_base(),
285+
pin->get_intermediate_length());
266286
return get_mapping_iertr::make_ready_future<LBAMappingRef>(std::move(pin));
267287
});
268288
});

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -713,6 +713,14 @@ class BtreeLBAManager : public LBAManager {
713713
laddr_t offset,
714714
extent_len_t length);
715715

716+
using get_indirect_pin_ret = get_mappings_iertr::future<BtreeLBAMappingRef>;
717+
get_indirect_pin_ret get_indirect_pin(
718+
op_context_t<laddr_t> c,
719+
LBABtree& btree,
720+
laddr_t key,
721+
laddr_t intermediate_key,
722+
extent_len_t length);
723+
716724
using _decref_intermediate_ret = ref_iertr::future<
717725
std::optional<ref_update_result_t>>;
718726
_decref_intermediate_ret _decref_intermediate(

0 commit comments

Comments
 (0)