]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore: add prior_poffset field in CachedExtent
authorZhang Song <zhangsong325@gmail.com>
Tue, 6 Dec 2022 06:48:02 +0000 (14:48 +0800)
committerZhang Song <zhangsong325@gmail.com>
Wed, 7 Dec 2022 06:26:58 +0000 (14:26 +0800)
Signed-off-by: Zhang Song <zhangsong325@gmail.com>
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/cached_extent.h
src/crimson/os/seastore/transaction.h

index 97f1cbaf38f130ce8d16efdc217d6283b4613121..4685cdb9791af81c4ae5e5dfec6e518eb54823f0 100644 (file)
@@ -1009,6 +1009,8 @@ CachedExtentRef Cache::duplicate_for_write(
 
   auto ret = i->duplicate_for_write();
   ret->prior_instance = i;
+  // duplicate_for_write won't occur after ool write finished
+  assert(!i->prior_poffset);
   t.add_mutated_extent(ret);
   if (ret->get_type() == extent_types_t::ROOT) {
     t.root = ret->cast<RootBlock>();
index c4283616235d3f0778d502c65e7bba722b208ff3..e7b85e7fcd61c2017551eb80a15153f5f0de1507 100644 (file)
@@ -202,12 +202,16 @@ public:
   friend std::ostream &operator<<(std::ostream &, extent_state_t);
   virtual std::ostream &print_detail(std::ostream &out) const { return out; }
   std::ostream &print(std::ostream &out) const {
+    std::string prior_poffset_str = prior_poffset
+      ? fmt::format("{}", *prior_poffset)
+      : "nullopt";
     out << "CachedExtent(addr=" << this
        << ", type=" << get_type()
        << ", version=" << version
        << ", dirty_from_or_retired_at=" << dirty_from_or_retired_at
        << ", modify_time=" << sea_time_point_printer_t{modify_time}
        << ", paddr=" << get_paddr()
+       << ", prior_paddr=" << prior_poffset_str
        << ", length=" << get_length()
        << ", state=" << state
        << ", last_committed_crc=" << last_committed_crc
@@ -414,6 +418,14 @@ public:
   bool is_inline() const {
     return poffset.is_relative();
   }
+
+  paddr_t get_prior_paddr_and_reset() {
+    assert(prior_poffset);
+    auto ret = *prior_poffset;
+    prior_poffset.reset();
+    return ret;
+  }
+
 private:
   template <typename T>
   friend class read_set_item_t;
@@ -466,6 +478,9 @@ private:
   /// address of original block -- relative iff is_pending() and is_clean()
   paddr_t poffset;
 
+  /// relative address before ool write, used to update mapping
+  std::optional<paddr_t> prior_poffset = std::nullopt;
+
   /// used to wait while in-progress commit completes
   std::optional<seastar::shared_promise<>> io_wait_promise;
   void set_io_wait() {
@@ -531,7 +546,13 @@ protected:
     last_committed_crc = crc;
   }
 
-  void set_paddr(paddr_t offset) { poffset = offset; }
+  void set_paddr(paddr_t offset, bool need_update_mapping = false) {
+    if (need_update_mapping) {
+      assert(!prior_poffset);
+      prior_poffset = poffset;
+    }
+    poffset = offset;
+  }
 
   /**
    * maybe_generate_relative
index 8901de8b2bb8d0fddb299f785ea5e6276460418c..b96da8a529ea4e801cad41206107b45499f9f95e 100644 (file)
@@ -180,7 +180,8 @@ public:
   void mark_delayed_extent_inline(LogicalCachedExtentRef& ref) {
     write_set.erase(*ref);
     assert(ref->get_paddr().is_delayed());
-    ref->set_paddr(make_record_relative_paddr(offset));
+    ref->set_paddr(make_record_relative_paddr(offset),
+                   /* need_update_mapping: */ true);
     offset += ref->get_length();
     inline_block_list.push_back(ref);
     write_set.insert(*ref);
@@ -189,7 +190,7 @@ public:
   void mark_delayed_extent_ool(LogicalCachedExtentRef& ref, paddr_t final_addr) {
     write_set.erase(*ref);
     assert(ref->get_paddr().is_delayed());
-    ref->set_paddr(final_addr);
+    ref->set_paddr(final_addr, /* need_update_mapping: */ true);
     assert(!ref->get_paddr().is_null());
     assert(!ref->is_inline());
     written_ool_block_list.push_back(ref);