]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: use swap for deferred_stable when not bluefs_layout.single_shared_device() 46225/head
authorwangyunqing <wangyunqing@inspur.com>
Wed, 11 May 2022 08:41:13 +0000 (16:41 +0800)
committerwangyunqing <wangyunqing@inspur.com>
Wed, 11 May 2022 08:58:03 +0000 (16:58 +0800)
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 <wangyunqing@inspur.com>
src/os/bluestore/BlueStore.cc

index 1263f19a4c710dc5892302bd8172fcd77c36c817..6a352922cab8644080631078c4a6cb8c4f2482d4 100644 (file)
@@ -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();