CachedExtentRef extent)
{
assert(extent->is_valid());
- auto p_extent = extent->get_transactional_view(t);
- if (!p_extent->is_pending_in_trans(t.get_trans_id())) {
- t.add_to_read_set(p_extent);
- touch_extent(*p_extent);
+ CachedExtent* p_extent;
+ if (extent->is_stable()) {
+ p_extent = extent->get_transactional_view(t);
+ if (p_extent != extent.get()) {
+ assert(!extent->is_stable_writting());
+ assert(p_extent->is_pending_in_trans(t.get_trans_id()));
+ assert(!p_extent->is_stable_writting());
+ if (p_extent->is_mutable()) {
+ assert(p_extent->is_fully_loaded());
+ assert(!p_extent->is_pending_io());
+ return get_extent_ertr::make_ready_future<CachedExtentRef>(
+ CachedExtentRef(p_extent));
+ } else {
+ assert(p_extent->is_exist_clean());
+ }
+ } else {
+ // stable from trans-view
+ assert(!p_extent->is_pending_in_trans(t.get_trans_id()));
+ t.add_to_read_set(p_extent);
+ touch_extent(*p_extent);
+ }
+ } else {
+ assert(!extent->is_stable_writting());
+ assert(extent->is_pending_in_trans(t.get_trans_id()));
+ if (extent->is_mutable()) {
+ assert(extent->is_fully_loaded());
+ assert(!extent->is_pending_io());
+ return get_extent_ertr::make_ready_future<CachedExtentRef>(extent);
+ } else {
+ assert(extent->is_exist_clean());
+ p_extent = extent.get();
+ }
}
+
+ assert(p_extent->is_stable() || p_extent->is_exist_clean());
// user should not see RETIRED_PLACEHOLDER extents
ceph_assert(p_extent->get_type() != extent_types_t::RETIRED_PLACEHOLDER);
if (!p_extent->is_fully_loaded()) {
assert(!p_extent->is_mutable());
- touch_extent(*p_extent);
LOG_PREFIX(Cache::get_extent_viewable_by_trans);
SUBDEBUG(seastore_cache,
"{} {}~{} is present without been fully loaded, reading ... -- {}",