From c38e83f69a2393350e5e90865c41a33bd5e5b046 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 7 Apr 2017 11:31:21 -0400 Subject: [PATCH] os/bluestore: make deferred_aggressive a counter Multiple threads may run _osr_drain_preceding; use a count to prevent the first finisher from prematurely disabling aggressive mode. Fixes: http://tracker.ceph.com/issues/19542 Signed-off-by: Sage Weil --- src/os/bluestore/BlueStore.cc | 8 ++++---- src/os/bluestore/BlueStore.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 8bdee10a504..599d6793240 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -7619,7 +7619,7 @@ void BlueStore::_osr_drain_preceding(TransContext *txc) { OpSequencer *osr = txc->osr.get(); dout(10) << __func__ << " " << txc << " osr " << osr << dendl; - deferred_aggressive = true; // FIXME: maybe osr-local aggressive flag? + ++deferred_aggressive; // FIXME: maybe osr-local aggressive flag? { // submit anything pending std::lock_guard l(deferred_lock); @@ -7633,7 +7633,7 @@ void BlueStore::_osr_drain_preceding(TransContext *txc) kv_cond.notify_one(); } osr->drain_preceding(txc); - deferred_aggressive = false; + --deferred_aggressive; dout(10) << __func__ << " " << osr << " done" << dendl; } @@ -7648,7 +7648,7 @@ void BlueStore::_osr_drain_all() } dout(20) << __func__ << " osr_set " << s << dendl; - deferred_aggressive = true; + ++deferred_aggressive; { // submit anything pending std::lock_guard l(deferred_lock); @@ -7663,7 +7663,7 @@ void BlueStore::_osr_drain_all() dout(20) << __func__ << " drain " << osr << dendl; osr->drain(); } - deferred_aggressive = false; + --deferred_aggressive; dout(10) << __func__ << " done" << dendl; } diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index 818c1897ba7..475ccc9d93a 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -1756,7 +1756,7 @@ private: 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 - atomic_bool deferred_aggressive = {false}; ///< aggressive wakeup of kv thread + atomic_int deferred_aggressive = {0}; ///< aggressive wakeup of kv thread int m_finisher_num = 1; vector finishers; -- 2.39.5