From 410e29d188b73a6747a0c1d04c86d15057da0f66 Mon Sep 17 00:00:00 2001 From: myoungwon oh Date: Thu, 5 May 2022 14:55:32 +0900 Subject: [PATCH] seastore: fix add_relative to work corretly in case of blk addr Signed-off-by: Myoungwon Oh --- src/crimson/os/seastore/btree/fixed_kv_node.h | 7 +------ src/crimson/os/seastore/cache.cc | 15 ++------------- .../seastore/lba_manager/btree/lba_btree_node.cc | 6 +----- src/crimson/os/seastore/seastore_types.h | 14 ++++++++++++++ 4 files changed, 18 insertions(+), 24 deletions(-) diff --git a/src/crimson/os/seastore/btree/fixed_kv_node.h b/src/crimson/os/seastore/btree/fixed_kv_node.h index bf6d9d3396f..2fc065b1013 100644 --- a/src/crimson/os/seastore/btree/fixed_kv_node.h +++ b/src/crimson/os/seastore/btree/fixed_kv_node.h @@ -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); } diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 5e7f23520a4..92cd6c59226 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -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); diff --git a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node.cc b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node.cc index ba0619d35cc..e3e69421fc6 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node.cc +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node.cc @@ -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); } diff --git a/src/crimson/os/seastore/seastore_types.h b/src/crimson/os/seastore/seastore_types.h index df69e39908b..b1e2f8b68c3 100644 --- a/src/crimson/os/seastore/seastore_types.h +++ b/src/crimson/os/seastore/seastore_types.h @@ -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; }