]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore/lba_manager: add get_physical_extent_if_live
authorSamuel Just <sjust@redhat.com>
Thu, 17 Sep 2020 22:56:20 +0000 (15:56 -0700)
committerSamuel Just <sjust@redhat.com>
Tue, 20 Oct 2020 19:27:08 +0000 (12:27 -0700)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/lba_manager.h
src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc
src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h
src/crimson/os/seastore/seastore_types.h
src/crimson/os/seastore/segment_cleaner.h
src/crimson/os/seastore/transaction_manager.cc
src/crimson/os/seastore/transaction_manager.h

index 245e7e08c3a0741940fddf17f4510a32611a8f59..ad90f4c4f6e8093c0c1c2c73a3a0819a66b32866 100644 (file)
@@ -171,6 +171,26 @@ public:
     Transaction &t,
     CachedExtentRef extent) = 0;
 
+  /**
+   * get_physical_extent_if_live
+   *
+   * Returns extent at addr/laddr if still live (if laddr
+   * still points at addr).  Extent must be an internal, physical
+   * extent.
+   *
+   * Returns a null CachedExtentRef if extent is not live.
+   */
+  using get_physical_extent_if_live_ertr = crimson::errorator<
+    crimson::ct_error::input_output_error>;
+  using get_physical_extent_if_live_ret =
+    get_physical_extent_if_live_ertr::future<CachedExtentRef>;
+  virtual get_physical_extent_if_live_ret get_physical_extent_if_live(
+    Transaction &t,
+    extent_types_t type,
+    paddr_t addr,
+    laddr_t laddr,
+    segment_off_t len) = 0;
+
   virtual void add_pin(LBAPin &pin) = 0;
 
   virtual ~LBAManager() {}
index a49f7dbde3c3a936276f83581c923a8f61e04c3a..95523769d83eaffd55b33dac1f6bc4caa1e5bbe8 100644 (file)
@@ -159,10 +159,15 @@ BtreeLBAManager::set_extent(
     });
 }
 
+static bool is_lba_node(extent_types_t type)
+{
+  return type == extent_types_t::LADDR_INTERNAL ||
+    type == extent_types_t::LADDR_LEAF;
+}
+
 static bool is_lba_node(const CachedExtent &e)
 {
-  return e.get_type() == extent_types_t::LADDR_INTERNAL ||
-    e.get_type() == extent_types_t::LADDR_LEAF;
+  return is_lba_node(e.get_type());
 }
 
 btree_range_pin_t &BtreeLBAManager::get_pin(CachedExtent &e)
@@ -405,6 +410,43 @@ BtreeLBAManager::rewrite_extent_ret BtreeLBAManager::rewrite_extent(
   }
 }
 
+BtreeLBAManager::get_physical_extent_if_live_ret
+BtreeLBAManager::get_physical_extent_if_live(
+  Transaction &t,
+  extent_types_t type,
+  paddr_t addr,
+  laddr_t laddr,
+  segment_off_t len)
+{
+  ceph_assert(is_lba_node(type));
+  return cache.get_extent_by_type(
+    t,
+    type,
+    addr,
+    laddr,
+    len
+  ).safe_then([=, &t](CachedExtentRef extent) {
+    return get_root(t).safe_then([=, &t](LBANodeRef root) {
+      auto lba_node = extent->cast<LBANode>();
+      return root->lookup(
+       op_context_t{cache, pin_set, t},
+       lba_node->get_node_meta().begin,
+       lba_node->get_node_meta().depth).safe_then([=, &t](LBANodeRef c) {
+         if (c->get_paddr() == lba_node->get_paddr()) {
+           return get_physical_extent_if_live_ret(
+             get_physical_extent_if_live_ertr::ready_future_marker{},
+             lba_node);
+         } else {
+           cache.drop_from_cache(lba_node);
+           return get_physical_extent_if_live_ret(
+             get_physical_extent_if_live_ertr::ready_future_marker{},
+             CachedExtentRef());
+         }
+       });
+    });
+  });
+}
+
 BtreeLBAManager::BtreeLBAManager(
   SegmentManager &segment_manager,
   Cache &cache)
index 7de463026bcb37d6359da4128d289ba13da5684d..640d567348f5d83f6c46ddcbdae18e70bf27b815 100644 (file)
@@ -101,6 +101,13 @@ public:
     Transaction &t,
     CachedExtentRef extent);
 
+  get_physical_extent_if_live_ret get_physical_extent_if_live(
+    Transaction &t,
+    extent_types_t type,
+    paddr_t addr,
+    laddr_t laddr,
+    segment_off_t len) final;
+
   void add_pin(LBAPin &pin) final {
     auto *bpin = reinterpret_cast<BtreeLBAPin*>(&pin);
     pin_set.add_pin(bpin->pin);
index fa556e2e3525bb9273ef8b3528d6171d13122986..56bf53b72fbffd9a409d0a19d41a8c2098f6d233 100644 (file)
@@ -278,6 +278,17 @@ enum class extent_types_t : uint8_t {
   NONE = 0xFF
 };
 
+inline bool is_logical_type(extent_types_t type) {
+  switch (type) {
+  case extent_types_t::ROOT:
+  case extent_types_t::LADDR_INTERNAL:
+  case extent_types_t::LADDR_LEAF:
+    return false;
+  default:
+    return true;
+  }
+}
+
 std::ostream &operator<<(std::ostream &out, extent_types_t t);
 
 /* description of a new physical extent */
index 6bb698acb90919209f0b0ce08b785955fbd7db3a..caa903e97529de921f0b32df0efaa8695af7968b 100644 (file)
@@ -250,6 +250,26 @@ public:
     virtual rewrite_extent_ret rewrite_extent(
       Transaction &t,
       CachedExtentRef extent) = 0;
+
+    /**
+     * get_extent_if_live
+     *
+     * Returns extent at specified location if still referenced by
+     * lba_manager and not removed by t.
+     *
+     * See TransactionManager::get_extent_if_live and
+     * LBAManager::get_physical_extent_if_live.
+     */
+    using get_extent_if_live_ertr = crimson::errorator<
+      crimson::ct_error::input_output_error>;
+    using get_extent_if_live_ret = get_extent_if_live_ertr::future<
+      CachedExtentRef>;
+    virtual get_extent_if_live_ret get_extent_if_live(
+      Transaction &t,
+      extent_types_t type,
+      paddr_t addr,
+      laddr_t laddr,
+      segment_off_t len) = 0;
   };
 
 private:
index 36d86b0b89900722790f73565dff9980532d5d9e..298cc00f54110d14612f67448a8642aa3dbe53a7 100644 (file)
@@ -233,6 +233,73 @@ TransactionManager::rewrite_extent_ret TransactionManager::rewrite_extent(
   return lba_manager.rewrite_extent(t, extent);
 }
 
+TransactionManager::get_extent_if_live_ret TransactionManager::get_extent_if_live(
+  Transaction &t,
+  extent_types_t type,
+  paddr_t addr,
+  laddr_t laddr,
+  segment_off_t len)
+{
+  CachedExtentRef ret;
+  auto status = cache.get_extent_if_cached(t, addr, &ret);
+  if (status != Transaction::get_extent_ret::ABSENT) {
+    return get_extent_if_live_ret(
+      get_extent_if_live_ertr::ready_future_marker{},
+      ret);
+  }
+
+  if (is_logical_type(type)) {
+    return lba_manager.get_mapping(
+      t,
+      laddr,
+      len).safe_then([=, &t](lba_pin_list_t pins) {
+       ceph_assert(pins.size() <= 1);
+       if (pins.empty()) {
+         return get_extent_if_live_ret(
+           get_extent_if_live_ertr::ready_future_marker{},
+           CachedExtentRef());
+       }
+
+       auto pin = std::move(pins.front());
+       pins.pop_front();
+       ceph_assert(pin->get_laddr() == laddr);
+       ceph_assert(pin->get_length() == (extent_len_t)len);
+       if (pin->get_paddr() == addr) {
+         return cache.get_extent_by_type(
+           t,
+           type,
+           addr,
+           laddr,
+           len).safe_then(
+             [this, &t, pin=std::move(pin)](CachedExtentRef ret) mutable {
+               auto lref = ret->cast<LogicalCachedExtent>();
+               if (!lref->has_pin()) {
+                 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{},
+                 ret);
+             });
+       } else {
+         return get_extent_if_live_ret(
+           get_extent_if_live_ertr::ready_future_marker{},
+           CachedExtentRef());
+       }
+      });
+  } else {
+    logger().debug(
+      "TransactionManager::get_extent_if_live: non-logical extent {}",
+      addr);
+    return lba_manager.get_physical_extent_if_live(
+      t,
+      type,
+      addr,
+      laddr,
+      len);
+  }
+}
+
 TransactionManager::~TransactionManager() {}
 
 }
index 4536f28e07f8fd1d7ddc9cc43bc7b5a813117974..4a93a6b156d2c3bdadc2feef45aa1cf5d397f343 100644 (file)
@@ -227,6 +227,14 @@ public:
     Transaction &t,
     CachedExtentRef extent) final;
 
+  using SegmentCleaner::ExtentCallbackInterface::get_extent_if_live_ret;
+  get_extent_if_live_ret get_extent_if_live(
+    Transaction &t,
+    extent_types_t type,
+    paddr_t addr,
+    laddr_t laddr,
+    segment_off_t len) final;
+
   ~TransactionManager();
 
 private: