]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: make deferred_aggressive a counter 14306/head
authorSage Weil <sage@redhat.com>
Fri, 7 Apr 2017 15:31:21 +0000 (11:31 -0400)
committerSage Weil <sage@redhat.com>
Fri, 7 Apr 2017 15:31:21 +0000 (11:31 -0400)
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 <sage@redhat.com>
src/os/bluestore/BlueStore.cc
src/os/bluestore/BlueStore.h

index 8bdee10a504c521937ba6c0b0034a7ba8d359a60..599d6793240ab48b6679782a4330387a92d209c7 100644 (file)
@@ -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<std::mutex> 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<std::mutex> 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;
 }
index 818c1897ba7284601fa8fa556fef2088d9fd29ff..475ccc9d93a0b1f429b0a5d4d04c915ff0151268 100644 (file)
@@ -1756,7 +1756,7 @@ private:
   std::atomic<uint64_t> 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<Finisher*> finishers;