]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/.../lba_btree_node_impl: use node_[un]resolve_vals
authorSamuel Just <sjust@redhat.com>
Mon, 19 Oct 2020 20:13:26 +0000 (13:13 -0700)
committerSamuel Just <sjust@redhat.com>
Tue, 20 Oct 2020 19:27:12 +0000 (12:27 -0700)
Implement node_[un]resolve_vals to transform values to/from block relative
representations when copying out of/in to newly created blocks.  This can
happen when splitting a node which has had entries added during the
same transaction, or itself was created during the transaction.

Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.h

index da94313758fcb74ed4e082d33905882ee0deb0d8..5dd1ea5821d271727cffd5b323877ce382444a40 100644 (file)
@@ -184,8 +184,6 @@ struct LBAInternalNode
   }
 
   /**
-   * resolve_relative_addrs
-   *
    * Internal relative addresses on read or in memory prior to commit
    * are either record or block relative depending on whether this
    * physical node is is_initial_pending() or just is_pending().
@@ -195,6 +193,26 @@ struct LBAInternalNode
    * based on base.
    */
   void resolve_relative_addrs(paddr_t base) final;
+  void node_resolve_vals(iterator from, iterator to) const final {
+    if (is_initial_pending()) {
+      for (auto i = from; i != to; ++i) {
+       if (i->get_val().is_relative()) {
+         assert(i->get_val().is_block_relative());
+         i->set_val(get_paddr().add_relative(i->get_val()));
+       }
+      }
+    }
+  }
+  void node_unresolve_vals(iterator from, iterator to) const final {
+    if (is_initial_pending()) {
+      for (auto i = from; i != to; ++i) {
+       if (i->get_val().is_relative()) {
+         assert(i->get_val().is_record_relative());
+         i->set_val(i->get_val() - get_paddr());
+       }
+      }
+    }
+  }
 
   extent_types_t get_type() const final {
     return type;
@@ -440,6 +458,31 @@ struct LBALeafNode
 
   // See LBAInternalNode, same concept
   void resolve_relative_addrs(paddr_t base) final;
+  void node_resolve_vals(iterator from, iterator to) const final {
+    if (is_initial_pending()) {
+      for (auto i = from; i != to; ++i) {
+       auto val = i->get_val();
+       if (val.paddr.is_relative()) {
+         assert(val.paddr.is_block_relative());
+         val.paddr = get_paddr().add_relative(val.paddr);
+         i->set_val(val);
+       }
+      }
+    }
+  }
+  void node_unresolve_vals(iterator from, iterator to) const final {
+    if (is_initial_pending()) {
+      for (auto i = from; i != to; ++i) {
+       auto val = i->get_val();
+       if (val.paddr.is_relative()) {
+         auto val = i->get_val();
+         assert(val.paddr.is_record_relative());
+         val.paddr = val.paddr - get_paddr();
+         i->set_val(val);
+       }
+      }
+    }
+  }
 
   ceph::bufferlist get_delta() final {
     assert(!delta_buffer.empty());