}
if (is_logical_type(type)) {
- // TODO: switch to get_mapping()
- return lba_manager->get_mappings(
+ return lba_manager->get_mapping(
t,
- laddr,
- len).safe_then([=, &t](lba_pin_list_t pins) {
- ceph_assert(pins.size() <= 1);
- if (pins.empty()) {
- return get_extent_if_live_ret(
- get_extent_if_live_ertr::ready_future_marker{},
- CachedExtentRef());
- }
-
- auto pin = std::move(pins.front());
- pins.pop_front();
+ laddr).safe_then([=, &t] (LBAPinRef pin) {
ceph_assert(pin->get_laddr() == laddr);
ceph_assert(pin->get_length() == (extent_len_t)len);
if (pin->get_paddr() == addr) {
get_extent_if_live_ertr::ready_future_marker{},
CachedExtentRef());
}
- });
+ }).handle_error(crimson::ct_error::enoent::handle([] {
+ return get_extent_if_live_ret(
+ get_extent_if_live_ertr::ready_future_marker{},
+ CachedExtentRef());
+ }), crimson::ct_error::pass_further_all{});
} else {
DEBUGT("non-logical extent {}", t, addr);
return lba_manager->get_physical_extent_if_live(
return cache->create_weak_transaction();
}
+ /**
+ * get_pin
+ *
+ * Get the logical pin at offset
+ */
+ using get_pin_ertr = LBAManager::get_mapping_ertr;
+ using get_pin_ret = LBAManager::get_mapping_ret;
+ get_pin_ret get_pin(
+ Transaction &t,
+ laddr_t offset) {
+ return lba_manager->get_mapping(t, offset);
+ }
+
/**
* get_pins
*
*
* Get extent mapped at pin.
*/
- using pin_to_extent_ertr = get_pins_ertr::extend_ertr<
+ using pin_to_extent_ertr = get_pin_ertr::extend_ertr<
SegmentManager::read_ertr>;
template <typename T>
using pin_to_extent_ret = pin_to_extent_ertr::future<
*
* Read extent of type T at offset~length
*/
- using read_extent_ertr = get_pins_ertr::extend_ertr<
+ using read_extent_ertr = get_pin_ertr::extend_ertr<
SegmentManager::read_ertr>;
template <typename T>
using read_extent_ret = read_extent_ertr::future<
laddr_t offset,
extent_len_t length) {
LOG_PREFIX(TransactionManager::read_extent);
- return get_pins(
- t, offset, length
- ).safe_then([this, FNAME, &t, offset, length](auto pins) {
- if (pins.size() != 1 || !pins.front()->get_paddr().is_real()) {
- ERRORT(
- "offset {} len {} got {} extents:",
- t, offset, length, pins.size());
- for (auto &i: pins) {
- ERRORT("\t{}", t, *i);
- }
- ceph_assert(0 == "Should be impossible");
+ return get_pin(
+ t, offset
+ ).safe_then([this, FNAME, &t, offset, length] (auto pin) {
+ if (length != pin->get_length() || !pin->get_paddr().is_real()) {
+ ERRORT("offset {} len {} got wrong pin {}",
+ t, offset, length, *pin);
+ ceph_assert(0 == "Should be impossible");
}
- return this->pin_to_extent<T>(t, std::move(pins.front()));
+ return this->pin_to_extent<T>(t, std::move(pin));
});
}