From 39bcce840056476f0c84ae0a06f60cf72ddcca03 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Mon, 13 Jul 2020 22:16:03 -0700 Subject: [PATCH] crimson/os/seastore: init laddr for LogicalCachedExtent on replay Signed-off-by: Samuel Just --- src/crimson/os/seastore/cache.cc | 88 +++++++++++-------- src/crimson/os/seastore/cache.h | 1 + src/crimson/os/seastore/cached_extent.h | 10 ++- src/crimson/os/seastore/seastore_types.cc | 1 + src/crimson/os/seastore/seastore_types.h | 6 +- .../seastore/test_btree_lba_manager.cc | 1 + .../crimson/seastore/test_seastore_journal.cc | 1 + 7 files changed, 66 insertions(+), 42 deletions(-) diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 9f2b2c84bd466..d77ffde8864d9 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -131,6 +131,9 @@ std::optional Cache::try_construct_record(Transaction &t) delta_info_t{ i->get_type(), i->get_paddr(), + (i->is_logical() + ? i->cast()->get_laddr() + : L_ADDR_NULL), i->last_committed_crc, final_crc, (segment_off_t)i->get_length(), @@ -145,6 +148,7 @@ std::optional Cache::try_construct_record(Transaction &t) delta_info_t{ extent_types_t::ROOT, paddr_t{}, + L_ADDR_NULL, 0, 0, 0, @@ -243,6 +247,7 @@ Cache::replay_delta(paddr_t record_base, const delta_info_t &delta) return get_extent_by_type( delta.type, delta.paddr, + delta.laddr, delta.length).safe_then([this, record_base, delta](auto extent) { logger().debug( "replay_delta: replaying {} on {}", @@ -280,45 +285,54 @@ Cache::get_root_ret Cache::get_root(Transaction &t) Cache::get_extent_ertr::future Cache::get_extent_by_type( extent_types_t type, paddr_t offset, + laddr_t laddr, segment_off_t length) { - switch (type) { - case extent_types_t::ROOT: - assert(0 == "ROOT is never directly read"); - return get_extent_ertr::make_ready_future(); - case extent_types_t::LADDR_INTERNAL: - return get_extent(offset, length - ).safe_then([](auto extent) { - return CachedExtentRef(extent.detach(), false /* add_ref */); - }); - case extent_types_t::LADDR_LEAF: - return get_extent(offset, length - ).safe_then([](auto extent) { - return CachedExtentRef(extent.detach(), false /* add_ref */); - }); - case extent_types_t::ONODE_BLOCK: - return get_extent(offset, length - ).safe_then([](auto extent) { - return CachedExtentRef(extent.detach(), false /* add_ref */); - }); - case extent_types_t::TEST_BLOCK: - return get_extent(offset, length - ).safe_then([](auto extent) { - return CachedExtentRef(extent.detach(), false /* add_ref */); - }); - case extent_types_t::TEST_BLOCK_PHYSICAL: - return get_extent(offset, length - ).safe_then([](auto extent) { - return CachedExtentRef(extent.detach(), false /* add_ref */); - }); - case extent_types_t::NONE: { - ceph_assert(0 == "NONE is an invalid extent type"); - return get_extent_ertr::make_ready_future(); - } - default: - ceph_assert(0 == "impossible"); - return get_extent_ertr::make_ready_future(); - } + return [=] { + switch (type) { + case extent_types_t::ROOT: + assert(0 == "ROOT is never directly read"); + return get_extent_ertr::make_ready_future(); + case extent_types_t::LADDR_INTERNAL: + return get_extent(offset, length + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::LADDR_LEAF: + return get_extent(offset, length + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::ONODE_BLOCK: + return get_extent(offset, length + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::TEST_BLOCK: + return get_extent(offset, length + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::TEST_BLOCK_PHYSICAL: + return get_extent(offset, length + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::NONE: { + ceph_assert(0 == "NONE is an invalid extent type"); + return get_extent_ertr::make_ready_future(); + } + default: + ceph_assert(0 == "impossible"); + return get_extent_ertr::make_ready_future(); + } + }().safe_then([laddr](CachedExtentRef e) { + assert(e->is_logical() == (laddr != L_ADDR_NULL)); + if (e->is_logical()) { + e->cast()->set_laddr(laddr); + } + return get_extent_ertr::make_ready_future(e); + }); } } diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index cc530512eab07..50aeff0fa7d66 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -339,6 +339,7 @@ private: get_extent_ertr::future get_extent_by_type( extent_types_t type, ///< [in] type tag paddr_t offset, ///< [in] starting addr + laddr_t laddr, ///< [in] logical address if logical segment_off_t length ///< [in] length ); }; diff --git a/src/crimson/os/seastore/cached_extent.h b/src/crimson/os/seastore/cached_extent.h index 77a298b75347e..e058aa071a610 100644 --- a/src/crimson/os/seastore/cached_extent.h +++ b/src/crimson/os/seastore/cached_extent.h @@ -533,6 +533,7 @@ public: void set_pin(LBAPinRef &&npin) { assert(!pin); pin = std::move(npin); + laddr = pin->get_laddr(); } bool has_pin() const { @@ -545,8 +546,12 @@ public: } laddr_t get_laddr() const { - assert(pin); - return pin->get_laddr(); + assert(laddr != L_ADDR_NULL); + return laddr; + } + + void set_laddr(laddr_t nladdr) { + laddr = nladdr; } void apply_delta_and_adjust_crc( @@ -562,6 +567,7 @@ protected: virtual void apply_delta(const ceph::bufferlist &bl) = 0; private: + laddr_t laddr = L_ADDR_NULL; LBAPinRef pin; }; diff --git a/src/crimson/os/seastore/seastore_types.cc b/src/crimson/os/seastore/seastore_types.cc index becd0469200bc..b2ce3a766962c 100644 --- a/src/crimson/os/seastore/seastore_types.cc +++ b/src/crimson/os/seastore/seastore_types.cc @@ -78,6 +78,7 @@ std::ostream &operator<<(std::ostream &lhs, const delta_info_t &rhs) return lhs << "delta_info_t(" << "type: " << rhs.type << ", paddr: " << rhs.paddr + << ", laddr: " << rhs.laddr << ", prev_crc: " << rhs.prev_crc << ", final_crc: " << rhs.final_crc << ", length: " << rhs.length diff --git a/src/crimson/os/seastore/seastore_types.h b/src/crimson/os/seastore/seastore_types.h index ff18a27235154..5abd279d69043 100644 --- a/src/crimson/os/seastore/seastore_types.h +++ b/src/crimson/os/seastore/seastore_types.h @@ -235,8 +235,7 @@ constexpr extent_version_t EXTENT_VERSION_NULL = 0; struct delta_info_t { extent_types_t type = extent_types_t::NONE; ///< delta type paddr_t paddr; ///< physical address - /* logical address -- needed for repopulating cache -- TODO don't actually need */ - // laddr_t laddr = L_ADDR_NULL; + laddr_t laddr = L_ADDR_NULL; ///< logical address uint32_t prev_crc = 0; uint32_t final_crc = 0; segment_off_t length = NULL_SEG_OFF; ///< extent length @@ -247,7 +246,7 @@ struct delta_info_t { DENC_START(1, 1, p); denc(v.type, p); denc(v.paddr, p); - //denc(v.laddr, p); + denc(v.laddr, p); denc(v.prev_crc, p); denc(v.final_crc, p); denc(v.length, p); @@ -260,6 +259,7 @@ struct delta_info_t { return ( type == rhs.type && paddr == rhs.paddr && + laddr == rhs.laddr && prev_crc == rhs.prev_crc && final_crc == rhs.final_crc && length == rhs.length && diff --git a/src/test/crimson/seastore/test_btree_lba_manager.cc b/src/test/crimson/seastore/test_btree_lba_manager.cc index 05d76638db6cf..264606975b13e 100644 --- a/src/test/crimson/seastore/test_btree_lba_manager.cc +++ b/src/test/crimson/seastore/test_btree_lba_manager.cc @@ -64,6 +64,7 @@ struct btree_lba_manager_test : return journal.submit_record(std::move(*record)).safe_then( [this, t=std::move(t)](paddr_t addr) mutable { cache.complete_commit(*t, addr); + lba_manager->complete_transaction(*t); }, crimson::ct_error::all_same_way([](auto e) { ceph_assert(0 == "Hit error submitting to journal"); diff --git a/src/test/crimson/seastore/test_seastore_journal.cc b/src/test/crimson/seastore/test_seastore_journal.cc index ec85768f82c2f..f54e8645292b3 100644 --- a/src/test/crimson/seastore/test_seastore_journal.cc +++ b/src/test/crimson/seastore/test_seastore_journal.cc @@ -182,6 +182,7 @@ struct journal_test_t : seastar_test_suite_t, JournalSegmentProvider { return delta_info_t{ extent_types_t::TEST_BLOCK, paddr_t{}, + L_ADDR_NULL, 0, 0, block_size, 1, -- 2.39.5