From: Samuel Just Date: Mon, 19 Oct 2020 20:13:26 +0000 (-0700) Subject: crimson/os/seastore/.../lba_btree_node_impl: use node_[un]resolve_vals X-Git-Tag: v16.1.0~807^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=95ddd9cfc8e658aa5c1829255d2bea77e001fa3e;p=ceph.git crimson/os/seastore/.../lba_btree_node_impl: use node_[un]resolve_vals 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 --- diff --git a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.h b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.h index da94313758fc..5dd1ea5821d2 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.h +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.h @@ -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());