]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/cache: init extents prior to read 44281/head
authorSamuel Just <sjust@redhat.com>
Fri, 10 Dec 2021 22:31:00 +0000 (14:31 -0800)
committerSamuel Just <sjust@redhat.com>
Fri, 10 Dec 2021 22:57:32 +0000 (14:57 -0800)
Thus should ensure that any captured members of extent_init_func are
still valid at the cost of not being able to access the contents of the
extent at invocation time.  With this, we should be able to rely on any
logical extents/lba extents in the cache having validly initialized lba
pins.

Fixes: https://tracker.ceph.com/issues/53555
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/cache.h

index 2bda709995f2caa7c888d9eb20b9baf15893f49b..08f2b6b350ccfdea93c3d5bde553c8ce9852ac2a 100644 (file)
@@ -192,8 +192,9 @@ public:
       ret->set_paddr(offset);
       ret->state = CachedExtent::extent_state_t::CLEAN_PENDING;
       add_extent(ret);
+      extent_init_func(*ret);
       return read_extent<T>(
-       std::move(ret), std::forward<Func>(extent_init_func));
+       std::move(ret));
     }
 
     // extent PRESENT in cache
@@ -211,8 +212,9 @@ public:
       }
 
       cached->state = CachedExtent::extent_state_t::INVALID;
+      extent_init_func(*ret);
       return read_extent<T>(
-       std::move(ret), std::forward<Func>(extent_init_func));
+       std::move(ret));
     } else {
       auto ret = TCachedExtentRef<T>(static_cast<T*>(cached.get()));
       return ret->wait_io(
@@ -879,10 +881,9 @@ private:
   /// Introspect transaction when it is being destructed
   void on_transaction_destruct(Transaction& t);
 
-  template <typename T, typename Func>
+  template <typename T>
   get_extent_ret<T> read_extent(
-    TCachedExtentRef<T>&& extent,
-    Func &&func
+    TCachedExtentRef<T>&& extent
   ) {
     assert(extent->state == CachedExtent::extent_state_t::CLEAN_PENDING);
     extent->set_io_wait();
@@ -891,13 +892,12 @@ private:
       extent->get_length(),
       extent->get_bptr()
     ).safe_then(
-      [extent=std::move(extent), func=std::forward<Func>(func)]() mutable {
+      [extent=std::move(extent)]() mutable {
         extent->state = CachedExtent::extent_state_t::CLEAN;
         /* TODO: crc should be checked against LBA manager */
         extent->last_committed_crc = extent->get_crc32c();
 
         extent->on_clean_read();
-       func(*extent);
         extent->complete_io();
         return get_extent_ertr::make_ready_future<TCachedExtentRef<T>>(
           std::move(extent));