assert(m_aio_modify_unsafe_contexts.empty());
assert(m_aio_modify_safe_contexts.empty());
assert(m_op_events.empty());
+ assert(m_in_flight_op_events == 0);
}
template <typename I>
}
assert(m_flush_ctx == nullptr);
- if (!m_op_events.empty() || flush_comp != nullptr) {
+ if (m_in_flight_op_events > 0 || flush_comp != nullptr) {
std::swap(m_flush_ctx, on_finish);
}
}
m_in_flight_aio_modify -= on_safe_ctxs.size();
std::swap(on_aio_ready, m_on_aio_ready);
- if (m_op_events.empty() &&
+ if (m_in_flight_op_events == 0 &&
(m_in_flight_aio_flush + m_in_flight_aio_modify) == 0) {
on_flush = m_flush_ctx;
}
return nullptr;
}
+ ++m_in_flight_op_events;
*op_event = &m_op_events[op_tid];
(*op_event)->on_start_safe = on_safe;
<< "r=" << r << dendl;
OpEvent op_event;
- Context *on_flush = nullptr;
bool shutting_down = false;
{
Mutex::Locker locker(m_lock);
m_op_events.erase(op_it);
shutting_down = (m_flush_ctx != nullptr);
- if (m_op_events.empty() &&
- (m_in_flight_aio_flush + m_in_flight_aio_modify) == 0) {
- on_flush = m_flush_ctx;
- }
}
assert(op_event.on_start_ready == nullptr || (r < 0 && r != -ERESTART));
if (op_event.on_finish_safe != nullptr) {
op_event.on_finish_safe->complete(r);
}
- if (on_flush != nullptr) {
- on_flush->complete(0);
+
+ // shut down request might have occurred while lock was
+ // dropped -- handle if pending
+ Mutex::Locker locker(m_lock);
+ assert(m_in_flight_op_events > 0);
+ --m_in_flight_op_events;
+ if (m_flush_ctx != nullptr && m_in_flight_op_events == 0 &&
+ (m_in_flight_aio_flush + m_in_flight_aio_modify) == 0) {
+ m_image_ctx.op_work_queue->queue(m_flush_ctx, 0);
}
}