CachedExtentRef extent) final
{
assert(extent);
- return extent->get_transactional_view(t);
+ auto ext = extent->maybe_get_transactional_view(t);
+ ceph_assert(ext);
+ return ext;
}
get_extent_iertr::future<> maybe_wait_accessible(
bool needs_step_2 = false;
bool needs_touch = false;
if (extent->is_stable()) {
- p_extent = extent->get_transactional_view(t);
+ p_extent = extent->maybe_get_transactional_view(t);
+ ceph_assert(p_extent);
if (p_extent != extent.get()) {
assert(!extent->is_pending_io());
assert(p_extent->is_pending_in_trans(t.get_trans_id()));
parent_index->erase(*this);
}
}
-CachedExtent* CachedExtent::get_transactional_view(Transaction &t) {
- return get_transactional_view(t.get_trans_id());
-}
+CachedExtent* CachedExtent::maybe_get_transactional_view(Transaction &t) {
+ if (t.is_weak()) {
+ return this;
+ }
-CachedExtent* CachedExtent::get_transactional_view(transaction_id_t tid) {
- auto it = mutation_pending_extents.find(tid, trans_spec_view_t::cmp_t());
- if (it != mutation_pending_extents.end()) {
- return (CachedExtent*)&(*it);
- } else {
+ auto tid = t.get_trans_id();
+ if (is_pending()) {
+ ceph_assert(is_pending_in_trans(tid));
return this;
}
+
+ if (!mutation_pending_extents.empty()) {
+ auto it = mutation_pending_extents.find(tid, trans_spec_view_t::cmp_t());
+ if (it != mutation_pending_extents.end()) {
+ return (CachedExtent*)&(*it);
+ }
+ }
+
+ if (!retired_transactions.empty()) {
+ auto it = retired_transactions.find(tid, trans_spec_view_t::cmp_t());
+ if (it != retired_transactions.end()) {
+ return nullptr;
+ }
+ }
+
+ return this;
}
std::ostream &LogicalCachedExtent::print_detail(std::ostream &out) const
}
}
- CachedExtent* get_transactional_view(Transaction &t);
- CachedExtent* get_transactional_view(transaction_id_t tid);
+ CachedExtent* maybe_get_transactional_view(Transaction &t);
read_trans_set_t<Transaction> read_transactions;