From: Sage Weil Date: Tue, 29 Aug 2017 20:15:52 +0000 (-0400) Subject: os/bluestore: drop deferred_submit_lock X-Git-Tag: v12.2.1~73^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e9b89c8b011fbbeeb128553b1b12708155a52628;p=ceph.git os/bluestore: drop deferred_submit_lock This lock serves no purpose. It only protects the call to the aio_submit on the OpSequencer running batch, but we are the only caller who will do that submission, and a new batch won't be moved into place until ours is completed and retired (by the completion for the aio we are queueing). More importantly, this fixes a deadlock: - thread A submits aio, but the queue is full, and blocks - thread B blocks taking deferred_submit_lock while holding deferred_lock - aio completion thread blocks trying to take deferred_lock, and thus no further aios are drained. Fixes: http://tracker.ceph.com/issues/21171 Signed-off-by: Sage Weil (cherry picked from commit 7a5ef62af194373c3a8c307b05ae6d467e49c9f0) --- diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 44e58f80995..7b93f047e99 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -8756,8 +8756,6 @@ void BlueStore::_deferred_submit_unlock(OpSequencer *osr) ++i; } - // demote to deferred_submit_lock, then drop that too - std::lock_guard l(deferred_submit_lock); deferred_lock.unlock(); bdev->aio_submit(&b->ioc); } diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index 8c5eb4a02b4..1e427df7047 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -1841,7 +1841,7 @@ private: interval_set bluefs_extents; ///< block extents owned by bluefs interval_set bluefs_extents_reclaiming; ///< currently reclaiming - std::mutex deferred_lock, deferred_submit_lock; + std::mutex deferred_lock; std::atomic deferred_seq = {0}; deferred_osr_queue_t deferred_queue; ///< osr's with deferred io pending int deferred_queue_size = 0; ///< num txc's queued across all osrs