]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
seastore: fix add_relative to work corretly in case of blk addr
authormyoungwon oh <ohmyoungwon@gmail.com>
Thu, 5 May 2022 05:55:32 +0000 (14:55 +0900)
committermyoungwon oh <ohmyoungwon@gmail.com>
Thu, 19 May 2022 00:32:46 +0000 (09:32 +0900)
Signed-off-by: Myoungwon Oh <myoungwon.oh@samsung.com>
src/crimson/os/seastore/btree/fixed_kv_node.h
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/lba_manager/btree/lba_btree_node.cc
src/crimson/os/seastore/seastore_types.h

index bf6d9d3396f995898fe6f167b84494f9eb59978a..2fc065b101385bc0e537a55f6cf2acbd41600210 100644 (file)
@@ -217,12 +217,7 @@ struct FixedKVInternalNode
     LOG_PREFIX(FixedKVInternalNode::resolve_relative_addrs);
     for (auto i: *this) {
       if (i->get_val().is_relative()) {
-       paddr_t updated;
-       if (base.get_addr_type() == addr_types_t::SEGMENT) {
-         updated = base.add_relative(i->get_val());
-       } else {
-         updated = base.add_offset(i->get_val().as_seg_paddr().get_segment_off());
-       }
+       paddr_t updated = base.add_relative(i->get_val());
        SUBTRACE(seastore_fixedkv_tree, "{} -> {}", i->get_val(), updated);
        i->set_val(updated);
       }
index 5e7f23520a43c08763339895b2a30679c46d0530..92cd6c59226cb0219003789b1b0a988554515ba6 100644 (file)
@@ -1348,13 +1348,7 @@ void Cache::complete_commit(
     bool is_inline = false;
     if (i->is_inline()) {
       is_inline = true;
-      if (final_block_start.get_addr_type() == addr_types_t::SEGMENT) {
-       i->set_paddr(final_block_start.add_relative(i->get_paddr()));
-      } else if (final_block_start.get_addr_type() ==
-       addr_types_t::RANDOM_BLOCK) {
-       i->set_paddr(final_block_start.add_offset(
-         i->get_paddr().as_seg_paddr().get_segment_off()));
-      }
+      i->set_paddr(final_block_start.add_relative(i->get_paddr()));
     }
     i->last_committed_crc = i->get_crc32c();
     i->on_initial_write();
@@ -1543,12 +1537,7 @@ Cache::replay_delta(
     for (auto &alloc_blk : alloc_delta.alloc_blk_ranges) {
       if (alloc_blk.paddr.is_relative()) {
        assert(alloc_blk.paddr.is_record_relative());
-       if (record_base.get_addr_type() == addr_types_t::SEGMENT) {
-         alloc_blk.paddr = record_base.add_relative(alloc_blk.paddr);
-       } else {
-         alloc_blk.paddr = record_base.add_offset(
-           alloc_blk.paddr.as_seg_paddr().get_segment_off());
-       }
+       alloc_blk.paddr = record_base.add_relative(alloc_blk.paddr);
       }
       DEBUG("replay alloc_blk {}~{} {}, journal_seq: {}",
        alloc_blk.paddr, alloc_blk.len, alloc_blk.laddr, journal_seq);
index ba0619d35cceb3afd8f04b8948da7e107b89ef24..e3e69421fc641d27711f7548db7caa32b09ba79b 100644 (file)
@@ -39,11 +39,7 @@ void LBALeafNode::resolve_relative_addrs(paddr_t base)
   for (auto i: *this) {
     if (i->get_val().paddr.is_relative()) {
       auto val = i->get_val();
-      if (base.get_addr_type() == addr_types_t::SEGMENT) {
-       val.paddr = base.add_relative(val.paddr);
-      } else {
-       val.paddr = base.add_offset(val.paddr.as_seg_paddr().get_segment_off());
-      }
+      val.paddr = base.add_relative(val.paddr);
       TRACE("{} -> {}", i->get_val().paddr, val.paddr);
       i->set_val(val);
     }
index df69e39908bf3235b6ba9f1fc78ea4beeba38748..b1e2f8b68c31d6194bb014576a8634ca8868bc0e 100644 (file)
@@ -683,6 +683,19 @@ struct blk_paddr_t : public paddr_t {
     return paddr_t::make_blk_paddr(get_device_id(), get_block_off() + o);
   }
 
+  paddr_t add_relative(paddr_t o) const {
+    seastore_off_t off;
+    if (o.get_addr_type() == addr_types_t::SEGMENT) {
+      // segment addr is allocated when alloc_new_extent is called.
+      // But, if random block device is used,
+      // this eventually can be converted to blk addr after submit_record().
+      off = o.as_seg_paddr().get_segment_off();
+    } else {
+      off = o.as_blk_paddr().get_block_off();
+    }
+    return add_offset(off);
+  }
+
 private:
   void check_blk_off_valid(const block_off_t offset) const {
     assert(offset <= BLK_OFF_MAX);
@@ -1781,6 +1794,7 @@ inline paddr_t paddr_t::add_offset(int32_t o) const {
 
 inline paddr_t paddr_t::add_relative(paddr_t o) const {
   PADDR_OPERATION(addr_types_t::SEGMENT, seg_paddr_t, add_relative(o))
+  PADDR_OPERATION(addr_types_t::RANDOM_BLOCK, blk_paddr_t, add_relative(o))
   ceph_assert(0 == "not supported type");
   return P_ADDR_NULL;
 }