From: Samuel Just Date: Wed, 26 Aug 2020 21:49:34 +0000 (-0700) Subject: crimson/.../lba_manager/btree: hold a reference to parent until added to cache X-Git-Tag: v16.1.0~807^2~28 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c82610c070d35bbec099edcab35632ddaa2c5cc0;p=ceph.git crimson/.../lba_manager/btree: hold a reference to parent until added to cache Currently, we need to rely on the Transaction::read_set to ensure cache residence of a leaf node until TransactionManager adds the logical extent to the cache. The next patch, however, will introduce a lazy flag for Transaction's to enable doing snapshot inconsistent scans without populating the read_set, so we'll want this to work without it. Signed-off-by: Samuel Just --- diff --git a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h index 8287cfac2797e..7de463026bcb3 100644 --- a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h +++ b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h @@ -102,7 +102,9 @@ public: CachedExtentRef extent); void add_pin(LBAPin &pin) final { - pin_set.add_pin(reinterpret_cast(&pin)->pin); + auto *bpin = reinterpret_cast(&pin); + pin_set.add_pin(bpin->pin); + bpin->parent = nullptr; } private: diff --git a/src/crimson/os/seastore/lba_manager/btree/btree_range_pin.h b/src/crimson/os/seastore/lba_manager/btree/btree_range_pin.h index 3f6b5f12f62da..3fa218fc8cdc7 100644 --- a/src/crimson/os/seastore/lba_manager/btree/btree_range_pin.h +++ b/src/crimson/os/seastore/lba_manager/btree/btree_range_pin.h @@ -219,6 +219,15 @@ public: class BtreeLBAPin : public LBAPin { friend class BtreeLBAManager; + + /** + * parent + * + * populated until link_extent is called to ensure cache residence + * until add_pin is called. + */ + CachedExtentRef parent; + paddr_t paddr; btree_range_pin_t pin; @@ -226,9 +235,10 @@ public: BtreeLBAPin() = default; BtreeLBAPin( + CachedExtentRef parent, paddr_t paddr, lba_node_meta_t &&meta) - : paddr(paddr) { + : parent(parent), paddr(paddr) { pin.set_range(std::move(meta)); } diff --git a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.cc b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.cc index 4738ae6849ab3..1676a82be077f 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.cc +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.cc @@ -435,6 +435,7 @@ LBALeafNode::lookup_range_ret LBALeafNode::lookup_range( auto begin = i->get_key(); ret.emplace_back( std::make_unique( + this, val.paddr, lba_node_meta_t{ begin, begin + val.len, 0})); } @@ -473,6 +474,7 @@ LBALeafNode::insert_ret LBALeafNode::insert( return insert_ret( insert_ertr::ready_future_marker{}, std::make_unique( + this, val.paddr, lba_node_meta_t{ begin, begin + val.len, 0})); }