]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/cache: verify pending extents in get_extent_viewable_by_trans()
authorYingxin Cheng <yingxin.cheng@intel.com>
Wed, 31 Jul 2024 08:51:31 +0000 (16:51 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Mon, 5 Aug 2024 07:45:39 +0000 (15:45 +0800)
Distinguish specific cases carefully.

Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/cache.h

index 14331f4e87692798336a5db87b51c6f453c632b0..779df4f6f524bdf0fe9adc5e367aa13f6ac31deb 100644 (file)
@@ -476,16 +476,45 @@ public:
     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 ... -- {}",