void BlueStore::Onode::flush()
{
- std::unique_lock<std::mutex> l(flush_lock);
- ldout(c->store->cct, 20) << __func__ << " " << flush_txns << dendl;
- while (!flush_txns.empty())
- flush_cond.wait(l);
+ if (flushing_count) {
+ std::unique_lock<std::mutex> l(flush_lock);
+ ldout(c->store->cct, 20) << __func__ << " " << flush_txns << dendl;
+ while (!flush_txns.empty())
+ flush_cond.wait(l);
+ }
ldout(c->store->cct, 20) << __func__ << " done" << dendl;
}
std::lock_guard<std::mutex> l(o->flush_lock);
o->flush_txns.insert(txc);
+ o->flushing_count++;
}
// objects we modified but didn't affect the onode
if (txc->onodes.count(*p) == 0) {
std::lock_guard<std::mutex> l((*p)->flush_lock);
(*p)->flush_txns.insert(txc);
+ (*p)->flushing_count++;
++p;
} else {
// remove dups with onodes list to avoid problems in _txc_finish
<< dendl;
assert(o->flush_txns.count(txc));
o->flush_txns.erase(txc);
+ o->flushing_count--;
if (o->flush_txns.empty()) {
o->flush_cond.notify_all();
}
ExtentMap extent_map;
+ std::atomic<int> flushing_count = {0};
std::mutex flush_lock; ///< protect flush_txns
std::condition_variable flush_cond; ///< wait here for unapplied txns
set<TransContext*> flush_txns; ///< committing or wal txns