auto iter = lower_bound(addr);
return get_lba_btree_extent(
c,
+ this,
meta.depth - 1,
iter->get_val(),
get_paddr()).safe_then([c, addr, depth](auto child) {
[this, c, &result, addr, len](const auto &val) mutable {
return get_lba_btree_extent(
c,
+ this,
get_meta().depth - 1,
val.get_val(),
get_paddr()).safe_then(
auto insertion_pt = get_containing_child(laddr);
return get_lba_btree_extent(
c,
+ this,
get_meta().depth - 1,
insertion_pt->get_val(),
get_paddr()).safe_then(
}
return get_lba_btree_extent(
c,
+ this,
get_meta().depth - 1,
mutation_pt->get_val(),
get_paddr()
auto iter = get_containing_child(laddr);
return get_lba_btree_extent(
c,
+ this,
get_meta().depth - 1,
iter->get_val(),
get_paddr()
std::make_optional<laddr_t>(L_ADDR_NULL));
}
return get_lba_btree_extent(c,
+ this,
get_meta().depth - 1,
i->get_val(),
get_paddr()).safe_then(
[=, &f](auto &viter) {
return get_lba_btree_extent(
c,
+ this,
get_meta().depth - 1,
viter->get_val(),
get_paddr()).safe_then([=, &f](auto child) {
[=, &f](auto &viter) {
return get_lba_btree_extent(
c,
+ this,
get_meta().depth - 1,
viter->get_val(),
get_paddr()).safe_then([=, &f](auto child) {
auto donor_iter = donor_is_left ? iter - 1 : iter + 1;
return get_lba_btree_extent(
c,
+ this,
get_meta().depth - 1,
donor_iter->get_val(),
get_paddr()
return bound(addr, addr + len);
}
-get_lba_node_ertr::future<LBANodeRef> get_lba_btree_extent(
+get_lba_node_ret get_lba_btree_extent(
op_context_t c,
+ CachedExtentRef parent,
depth_t depth,
paddr_t offset,
paddr_t base)
return c.cache.get_extent<LBAInternalNode>(
c.trans,
offset,
- LBA_BLOCK_SIZE).safe_then([c](auto ret) {
+ LBA_BLOCK_SIZE).safe_then([c, parent](auto ret)
+ -> get_lba_node_ret {
auto meta = ret->get_meta();
if (ret->get_size()) {
ceph_assert(meta.begin <= ret->begin()->get_key());
ceph_assert(meta.end > (ret->end() - 1)->get_key());
}
+ if (parent->has_been_invalidated() || ret->has_been_invalidated()) {
+ return crimson::ct_error::eagain::make();
+ }
if (!ret->is_pending() && !ret->pin.is_linked()) {
ret->pin.set_range(meta);
c.pins.add_pin(ret->pin);
}
- return LBANodeRef(ret.detach(), /* add_ref = */ false);
+ return get_lba_node_ret(
+ get_lba_node_ertr::ready_future_marker{},
+ LBANodeRef(ret.detach(), /* add_ref = */ false));
});
} else {
logger().debug(
return c.cache.get_extent<LBALeafNode>(
c.trans,
offset,
- LBA_BLOCK_SIZE).safe_then([offset, c](auto ret) {
+ LBA_BLOCK_SIZE).safe_then([offset, c, parent](auto ret)
+ -> get_lba_node_ret {
logger().debug(
- "get_lba_btree_extent: read leaf at offset {} {}",
+ "get_lba_btree_extent: read leaf at offset {} {}, parent {}",
offset,
- *ret);
+ *ret,
+ *parent);
auto meta = ret->get_meta();
if (ret->get_size()) {
ceph_assert(meta.begin <= ret->begin()->get_key());
ceph_assert(meta.end > (ret->end() - 1)->get_key());
}
+ if (parent->has_been_invalidated() || ret->has_been_invalidated()) {
+ return crimson::ct_error::eagain::make();
+ }
if (!ret->is_pending() && !ret->pin.is_linked()) {
ret->pin.set_range(meta);
c.pins.add_pin(ret->pin);
}
- return LBANodeRef(ret.detach(), /* add_ref = */ false);
+ return get_lba_node_ret(
+ get_lba_node_ertr::ready_future_marker{},
+ LBANodeRef(ret.detach(), /* add_ref = */ false));
});
}
}
addr,
laddr,
len).safe_then(
- [this, pin=std::move(pin)](CachedExtentRef ret) mutable {
+ [this, pin=std::move(pin)](CachedExtentRef ret) mutable
+ -> get_extent_if_live_ret {
auto lref = ret->cast<LogicalCachedExtent>();
if (!lref->has_pin()) {
- lref->set_pin(std::move(pin));
- lba_manager.add_pin(lref->get_pin());
+ if (pin->has_been_invalidated() || lref->has_been_invalidated()) {
+ return crimson::ct_error::eagain::make();
+ } else {
+ lref->set_pin(std::move(pin));
+ lba_manager.add_pin(lref->get_pin());
+ }
}
return get_extent_if_live_ret(
get_extent_if_live_ertr::ready_future_marker{},
t,
pin->get_paddr(),
pin->get_length()
- ).safe_then([this, &pin, &ret_ref](auto ref) mutable {
+ ).safe_then([this, &pin, &ret_ref](auto ref) mutable
+ -> read_extent_ertr::future<> {
if (!ref->has_pin()) {
- ref->set_pin(std::move(pin));
- lba_manager.add_pin(ref->get_pin());
+ if (pin->has_been_invalidated() || ref->has_been_invalidated()) {
+ return crimson::ct_error::eagain::make();
+ } else {
+ ref->set_pin(std::move(pin));
+ lba_manager.add_pin(ref->get_pin());
+ }
}
ret_ref.push_back(std::make_pair(ref->get_laddr(), ref));
crimson::get_logger(ceph_subsys_filestore).debug(