From: Xuehan Xu Date: Tue, 11 Jul 2023 10:30:03 +0000 (+0800) Subject: crimson/os/seastore/transaction_manager: don't remove intermediate X-Git-Tag: v18.2.1~104^2~2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=eb827330d88aa53a03d453e930636030982ceb59;p=ceph.git crimson/os/seastore/transaction_manager: don't remove intermediate mapping when remapping pins Signed-off-by: Xuehan Xu (cherry picked from commit 4b14549e6ebd6aa63e9006d3c487e139731817fc) --- diff --git a/src/crimson/os/seastore/lba_manager.h b/src/crimson/os/seastore/lba_manager.h index 85ca6a5eb82d7..d7adf2304fbb6 100644 --- a/src/crimson/os/seastore/lba_manager.h +++ b/src/crimson/os/seastore/lba_manager.h @@ -118,7 +118,8 @@ public: */ virtual ref_ret decref_extent( Transaction &t, - laddr_t addr) = 0; + laddr_t addr, + bool cascade_remove) = 0; /** * Increments ref count on extent diff --git a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc index 4a4b5e4069020..a607cd612a59a 100644 --- a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc +++ b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc @@ -670,7 +670,8 @@ BtreeLBAManager::update_refcount_ret BtreeLBAManager::update_refcount( Transaction &t, laddr_t addr, - int delta) + int delta, + bool cascade_remove) { LOG_PREFIX(BtreeLBAManager::update_refcount); TRACET("laddr={}, delta={}", t, addr, delta); @@ -684,11 +685,11 @@ BtreeLBAManager::update_refcount( return out; }, nullptr - ).si_then([&t, addr, delta, FNAME, this](auto result) { + ).si_then([&t, addr, delta, FNAME, this, cascade_remove](auto result) { DEBUGT("laddr={}, delta={} done -- {}", t, addr, delta, result); auto fut = ref_iertr::make_ready_future< std::optional>>(); - if (!result.refcount && result.pladdr.is_laddr()) { + if (!result.refcount && result.pladdr.is_laddr() && cascade_remove) { fut = _decref_intermediate( t, result.pladdr.get_laddr(), 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 c14cb2682d9dd..892600ed0e94c 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 @@ -266,14 +266,15 @@ public: ref_ret decref_extent( Transaction &t, - laddr_t addr) final { - return update_refcount(t, addr, -1); + laddr_t addr, + bool cascade_remove) final { + return update_refcount(t, addr, -1, cascade_remove); } ref_ret incref_extent( Transaction &t, laddr_t addr) final { - return update_refcount(t, addr, 1); + return update_refcount(t, addr, 1, false); } ref_ret incref_extent( @@ -346,7 +347,8 @@ private: update_refcount_ret update_refcount( Transaction &t, laddr_t addr, - int delta); + int delta, + bool cascade_remove); /** * _update_mapping diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index a829358b1fed4..ad8e5f1a65f45 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -216,7 +216,7 @@ TransactionManager::ref_ret TransactionManager::dec_ref( { LOG_PREFIX(TransactionManager::dec_ref); TRACET("{}", t, *ref); - return lba_manager->decref_extent(t, ref->get_laddr() + return lba_manager->decref_extent(t, ref->get_laddr(), true ).si_then([this, FNAME, &t, ref](auto result) { DEBUGT("extent refcount is decremented to {} -- {}", t, result.refcount, *ref); @@ -227,13 +227,14 @@ TransactionManager::ref_ret TransactionManager::dec_ref( }); } -TransactionManager::ref_ret TransactionManager::dec_ref( +TransactionManager::ref_ret TransactionManager::_dec_ref( Transaction &t, - laddr_t offset) + laddr_t offset, + bool cascade_remove) { - LOG_PREFIX(TransactionManager::dec_ref); + LOG_PREFIX(TransactionManager::_dec_ref); TRACET("{}", t, offset); - return lba_manager->decref_extent(t, offset + return lba_manager->decref_extent(t, offset, cascade_remove ).si_then([this, FNAME, offset, &t](auto result) -> ref_ret { DEBUGT("extent refcount is decremented to {} -- {}~{}, {}", t, result.refcount, offset, result.length, result.addr); diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index 51d66e2f3818f..afc7a648886dc 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -253,7 +253,9 @@ public: /// Remove refcount for offset ref_ret dec_ref( Transaction &t, - laddr_t offset); + laddr_t offset) { + return _dec_ref(t, offset, true); + } /// remove refcount for list of offset using refs_ret = ref_iertr::future>; @@ -384,7 +386,7 @@ public: [this, &t, original_laddr, original_paddr, original_len, intermediate_base, intermediate_key] (auto &ret, auto &count, auto &original_bptr, auto &remaps) { - return dec_ref(t, original_laddr + return _dec_ref(t, original_laddr, false ).si_then([this, &t, &original_bptr, &ret, &count, &remaps, intermediate_base, intermediate_key, original_laddr, original_paddr, original_len](auto) { @@ -732,6 +734,12 @@ private: ExtentPlacementManager::dispatch_result_t dispatch_result, std::optional seq_to_trim = std::nullopt); + /// Remove refcount for offset + ref_ret _dec_ref( + Transaction &t, + laddr_t offset, + bool cascade_remove); + /** * pin_to_extent * diff --git a/src/test/crimson/seastore/test_btree_lba_manager.cc b/src/test/crimson/seastore/test_btree_lba_manager.cc index 082de11995679..f18c3ac670ad6 100644 --- a/src/test/crimson/seastore/test_btree_lba_manager.cc +++ b/src/test/crimson/seastore/test_btree_lba_manager.cc @@ -468,7 +468,8 @@ struct btree_lba_manager_test : btree_test_base { [=, this](auto &t) { return lba_manager->decref_extent( t, - target->first + target->first, + true ).si_then([this, &t, target](auto result) { EXPECT_EQ(result.refcount, target->second.refcount); if (result.refcount == 0) {