From 234d1c854494d96e5f06b7c29dc8463bc7b2963e Mon Sep 17 00:00:00 2001 From: wangyunqing Date: Wed, 11 May 2022 16:41:13 +0800 Subject: [PATCH] os/bluestore: use swap for deferred_stable when not bluefs_layout.single_shared_device() Fixes: https://tracker.ceph.com/issues/55608 When `bluefs_layout.single_shared_device()` is false and `deferred_done` is not empty, the `deferred_stable_queue` is always empty which make `deferred_stable` empty also. So we can use swap instead of insert when insert key of `deferred_done` to `deferred_stable`. Signed-off-by: wangyunqing --- src/os/bluestore/BlueStore.cc | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 1263f19a4c71..6a352922cab8 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -13251,10 +13251,14 @@ void BlueStore::_kv_sync_thread() // flush/barrier on block device bdev->flush(); - // if we flush then deferred done are now deferred stable - deferred_stable.insert(deferred_stable.end(), deferred_done.begin(), - deferred_done.end()); - deferred_done.clear(); + // if we flush then deferred done are now deferred stable + if (deferred_stable.empty()) { + deferred_stable.swap(deferred_done); + } else { + deferred_stable.insert(deferred_stable.end(), deferred_done.begin(), + deferred_done.end()); + deferred_done.clear(); + } } auto after_flush = mono_clock::now(); -- 2.47.3