std::lock_guard<std::mutex> l(osr_lock);
s = osr_set;
}
+
+ deferred_aggressive_cleanup = true;
+ {
+ // wake up any previously finished deferred events
+ std::lock_guard<std::mutex> l(kv_lock);
+ kv_cond.notify_one();
+ }
for (auto osr : s) {
dout(20) << __func__ << " drain " << osr << dendl;
osr->drain();
}
+ deferred_aggressive_cleanup = false;
dout(10) << __func__ << " done" << dendl;
}
}
}
osr->deferred_txc = last;
- dout(20) << " osr " << osr << " deferred_blocks 0x" << std::hex
+ dout(20) << __func__ << " osr " << osr << " deferred_blocks 0x" << std::hex
<< osr->deferred_blocks << std::dec << dendl;
_txc_aio_submit(last);
}
deferred_cleanup_queue.push_back(txc);
}
finished.clear();
- kv_cond.notify_one();
+
+ // in the normal case, do not bother waking up the kv thread; it will
+ // catch us on the next commit anyway.
+ if (deferred_aggressive_cleanup) {
+ kv_cond.notify_one();
+ }
return 0;
}
for (it->lower_bound(string()); it->valid(); it->next(), ++count) {
dout(20) << __func__ << " replay " << pretty_binary_string(it->key())
<< dendl;
- bluestore_deferred_transaction_t *deferred_txn = new bluestore_deferred_transaction_t;
+ bluestore_deferred_transaction_t *deferred_txn =
+ new bluestore_deferred_transaction_t;
bufferlist bl = it->value();
bufferlist::iterator p = bl.begin();
try {
std::mutex deferred_lock;
std::atomic<uint64_t> deferred_seq = {0};
deferred_osr_queue_t deferred_queue; ///< osr's with deferred io pending
+ bool deferred_aggressive_cleanup = false; ///< aggressive wakeup of kv thread
int m_finisher_num = 1;
vector<Finisher*> finishers;