]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: init laddr for LogicalCachedExtent on replay
authorSamuel Just <sjust@redhat.com>
Tue, 14 Jul 2020 05:16:03 +0000 (22:16 -0700)
committerSamuel Just <sjust@redhat.com>
Thu, 16 Jul 2020 23:16:42 +0000 (16:16 -0700)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/cache.h
src/crimson/os/seastore/cached_extent.h
src/crimson/os/seastore/seastore_types.cc
src/crimson/os/seastore/seastore_types.h
src/test/crimson/seastore/test_btree_lba_manager.cc
src/test/crimson/seastore/test_seastore_journal.cc

index 9f2b2c84bd466f36416e842ea9487179607d2ffb..d77ffde8864d92cfcb8f0d40cc531e2beea7a809 100644 (file)
@@ -131,6 +131,9 @@ std::optional<record_t> Cache::try_construct_record(Transaction &t)
       delta_info_t{
        i->get_type(),
        i->get_paddr(),
+       (i->is_logical()
+       ? i->cast<LogicalCachedExtent>()->get_laddr()
+       : L_ADDR_NULL),
        i->last_committed_crc,
        final_crc,
        (segment_off_t)i->get_length(),
@@ -145,6 +148,7 @@ std::optional<record_t> Cache::try_construct_record(Transaction &t)
       delta_info_t{
        extent_types_t::ROOT,
        paddr_t{},
+       L_ADDR_NULL,
        0,
        0,
        0,
@@ -243,6 +247,7 @@ Cache::replay_delta(paddr_t record_base, const delta_info_t &delta)
     return get_extent_by_type(
       delta.type,
       delta.paddr,
+      delta.laddr,
       delta.length).safe_then([this, record_base, delta](auto extent) {
        logger().debug(
          "replay_delta: replaying {} on {}",
@@ -280,45 +285,54 @@ Cache::get_root_ret Cache::get_root(Transaction &t)
 Cache::get_extent_ertr::future<CachedExtentRef> Cache::get_extent_by_type(
   extent_types_t type,
   paddr_t offset,
+  laddr_t laddr,
   segment_off_t length)
 {
-  switch (type) {
-  case extent_types_t::ROOT:
-    assert(0 == "ROOT is never directly read");
-    return get_extent_ertr::make_ready_future<CachedExtentRef>();
-  case extent_types_t::LADDR_INTERNAL:
-    return get_extent<lba_manager::btree::LBAInternalNode>(offset, length
-    ).safe_then([](auto extent) {
-      return CachedExtentRef(extent.detach(), false /* add_ref */);
-    });
-  case extent_types_t::LADDR_LEAF:
-    return get_extent<lba_manager::btree::LBALeafNode>(offset, length
-    ).safe_then([](auto extent) {
-      return CachedExtentRef(extent.detach(), false /* add_ref */);
-    });
-  case extent_types_t::ONODE_BLOCK:
-    return get_extent<OnodeBlock>(offset, length
-    ).safe_then([](auto extent) {
-      return CachedExtentRef(extent.detach(), false /* add_ref */);
-    });
-  case extent_types_t::TEST_BLOCK:
-    return get_extent<TestBlock>(offset, length
-    ).safe_then([](auto extent) {
-      return CachedExtentRef(extent.detach(), false /* add_ref */);
-    });
-  case extent_types_t::TEST_BLOCK_PHYSICAL:
-    return get_extent<TestBlockPhysical>(offset, length
-    ).safe_then([](auto extent) {
-      return CachedExtentRef(extent.detach(), false /* add_ref */);
-    });
-  case extent_types_t::NONE: {
-    ceph_assert(0 == "NONE is an invalid extent type");
-    return get_extent_ertr::make_ready_future<CachedExtentRef>();
-  }
-  default:
-    ceph_assert(0 == "impossible");
-    return get_extent_ertr::make_ready_future<CachedExtentRef>();
-  }
+  return [=] {
+    switch (type) {
+    case extent_types_t::ROOT:
+      assert(0 == "ROOT is never directly read");
+      return get_extent_ertr::make_ready_future<CachedExtentRef>();
+    case extent_types_t::LADDR_INTERNAL:
+      return get_extent<lba_manager::btree::LBAInternalNode>(offset, length
+      ).safe_then([](auto extent) {
+       return CachedExtentRef(extent.detach(), false /* add_ref */);
+      });
+    case extent_types_t::LADDR_LEAF:
+      return get_extent<lba_manager::btree::LBALeafNode>(offset, length
+      ).safe_then([](auto extent) {
+       return CachedExtentRef(extent.detach(), false /* add_ref */);
+      });
+    case extent_types_t::ONODE_BLOCK:
+      return get_extent<OnodeBlock>(offset, length
+      ).safe_then([](auto extent) {
+       return CachedExtentRef(extent.detach(), false /* add_ref */);
+      });
+    case extent_types_t::TEST_BLOCK:
+      return get_extent<TestBlock>(offset, length
+      ).safe_then([](auto extent) {
+       return CachedExtentRef(extent.detach(), false /* add_ref */);
+      });
+    case extent_types_t::TEST_BLOCK_PHYSICAL:
+      return get_extent<TestBlockPhysical>(offset, length
+      ).safe_then([](auto extent) {
+       return CachedExtentRef(extent.detach(), false /* add_ref */);
+      });
+    case extent_types_t::NONE: {
+      ceph_assert(0 == "NONE is an invalid extent type");
+      return get_extent_ertr::make_ready_future<CachedExtentRef>();
+    }
+    default:
+      ceph_assert(0 == "impossible");
+      return get_extent_ertr::make_ready_future<CachedExtentRef>();
+    }
+  }().safe_then([laddr](CachedExtentRef e) {
+    assert(e->is_logical() == (laddr != L_ADDR_NULL));
+    if (e->is_logical()) {
+      e->cast<LogicalCachedExtent>()->set_laddr(laddr);
+    }
+    return get_extent_ertr::make_ready_future<CachedExtentRef>(e);
+  });
 }
 
 }
index cc530512eab077c5540b57e583b1d4675f3dfaab..50aeff0fa7d661fae838b9b8327d23d49e56f767 100644 (file)
@@ -339,6 +339,7 @@ private:
   get_extent_ertr::future<CachedExtentRef> get_extent_by_type(
     extent_types_t type,  ///< [in] type tag
     paddr_t offset,       ///< [in] starting addr
+    laddr_t laddr,        ///< [in] logical address if logical
     segment_off_t length  ///< [in] length
   );
 };
index 77a298b75347e2b92d0423e05fc5cc97ceea2bd0..e058aa071a6109e7edba13d524102d9e108bd3eb 100644 (file)
@@ -533,6 +533,7 @@ public:
   void set_pin(LBAPinRef &&npin) {
     assert(!pin);
     pin = std::move(npin);
+    laddr = pin->get_laddr();
   }
 
   bool has_pin() const {
@@ -545,8 +546,12 @@ public:
   }
 
   laddr_t get_laddr() const {
-    assert(pin);
-    return pin->get_laddr();
+    assert(laddr != L_ADDR_NULL);
+    return laddr;
+  }
+
+  void set_laddr(laddr_t nladdr) {
+    laddr = nladdr;
   }
 
   void apply_delta_and_adjust_crc(
@@ -562,6 +567,7 @@ protected:
   virtual void apply_delta(const ceph::bufferlist &bl) = 0;
 
 private:
+  laddr_t laddr = L_ADDR_NULL;
   LBAPinRef pin;
 };
 
index becd0469200bc8c6a7e2b6be21f91296fec57598..b2ce3a766962ce416269d627ac136846df9c9a38 100644 (file)
@@ -78,6 +78,7 @@ std::ostream &operator<<(std::ostream &lhs, const delta_info_t &rhs)
   return lhs << "delta_info_t("
             << "type: " << rhs.type
             << ", paddr: " << rhs.paddr
+            << ", laddr: " << rhs.laddr
             << ", prev_crc: " << rhs.prev_crc
             << ", final_crc: " << rhs.final_crc
             << ", length: " << rhs.length
index ff18a27235154d5afa0463f67a396606ce87f93b..5abd279d69043af0690aa80b4b7711e39ecd1d47 100644 (file)
@@ -235,8 +235,7 @@ constexpr extent_version_t EXTENT_VERSION_NULL = 0;
 struct delta_info_t {
   extent_types_t type = extent_types_t::NONE;  ///< delta type
   paddr_t paddr;                               ///< physical address
-  /* logical address -- needed for repopulating cache -- TODO don't actually need */
-  // laddr_t laddr = L_ADDR_NULL;
+  laddr_t laddr = L_ADDR_NULL;                 ///< logical address
   uint32_t prev_crc = 0;
   uint32_t final_crc = 0;
   segment_off_t length = NULL_SEG_OFF;         ///< extent length
@@ -247,7 +246,7 @@ struct delta_info_t {
     DENC_START(1, 1, p);
     denc(v.type, p);
     denc(v.paddr, p);
-    //denc(v.laddr, p);
+    denc(v.laddr, p);
     denc(v.prev_crc, p);
     denc(v.final_crc, p);
     denc(v.length, p);
@@ -260,6 +259,7 @@ struct delta_info_t {
     return (
       type == rhs.type &&
       paddr == rhs.paddr &&
+      laddr == rhs.laddr &&
       prev_crc == rhs.prev_crc &&
       final_crc == rhs.final_crc &&
       length == rhs.length &&
index 05d76638db6cf220b167f4f7e904700e4b0363d8..264606975b13e1afd5d255af88588e8e863e5f17 100644 (file)
@@ -64,6 +64,7 @@ struct btree_lba_manager_test :
     return journal.submit_record(std::move(*record)).safe_then(
       [this, t=std::move(t)](paddr_t addr) mutable {
        cache.complete_commit(*t, addr);
+       lba_manager->complete_transaction(*t);
       },
       crimson::ct_error::all_same_way([](auto e) {
        ceph_assert(0 == "Hit error submitting to journal");
index ec85768f82c2fba230b141b4bbdf6196c64d6abf..f54e8645292b37d9b87ec75da61791f25b91fdeb 100644 (file)
@@ -182,6 +182,7 @@ struct journal_test_t : seastar_test_suite_t, JournalSegmentProvider {
     return delta_info_t{
       extent_types_t::TEST_BLOCK,
       paddr_t{},
+      L_ADDR_NULL,
       0, 0,
       block_size,
       1,