]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: lock collection on deferred _finish_write
authorPere Diaz Bou <pere-altea@hotmail.com>
Sun, 11 Feb 2024 17:45:31 +0000 (18:45 +0100)
committerPere Diaz Bou <pere-altea@hotmail.com>
Thu, 25 Apr 2024 13:56:19 +0000 (15:56 +0200)
Leaving deferred map unprotected caused race conditions that must be
dealt for correctness. This might impact performance.

Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com>
src/os/bluestore/BlueStore.cc

index f78f9ed508d1e5d37f50de7a1d39706ae3b37091..fe332eea5fc4cc726fe2eb3524a110fc3207b2c7 100644 (file)
@@ -13801,6 +13801,7 @@ void BlueStore::_txc_finish(TransContext *txc)
 
   for (auto &[onode, seq] : txc->buffers_written) {
     if (txc->deferred_txn && txc->deferred_txn->txc_seq == seq) {
+      std::unique_lock l(onode->c->lock);
       auto it = onode->c->deferred_seq_dependencies.find(seq);
       if (it != onode->c->deferred_seq_dependencies.end()) {
         for (auto &dependent_onode : it->second) {
@@ -18167,6 +18168,7 @@ void BlueStore::_shutdown_cache()
   }
   for (auto& p : coll_map) {
     // Clear deferred write buffers before clearing up Onodes
+    std::unique_lock l(p.second->lock);
     for (auto &[seq, onodes] : p.second->deferred_seq_dependencies) {
       for (auto &onode : onodes) {
         onode->bc._finish_write(onode->c->cache, seq);