cancel_async_requests();
+ on_finish = new LambdaContext([this, on_finish](int r) {
+ m_async_op_tracker.wait_for_ops(on_finish);
+ });
auto ctx = new LambdaContext([this, on_finish](int r) {
m_task_finisher->cancel_all(on_finish);
});
template <typename I>
void ImageWatcher<I>::schedule_async_complete(const AsyncRequestId &request,
int r) {
+ m_async_op_tracker.start_op();
auto ctx = new LambdaContext(
boost::bind(&ImageWatcher<I>::notify_async_complete, this, request, r));
m_task_finisher->queue(ctx);
if (ret_val < 0) {
lderr(m_image_ctx.cct) << this << " failed to notify async complete: "
<< cpp_strerror(ret_val) << dendl;
- if (ret_val == -ETIMEDOUT) {
+ if (ret_val == -ETIMEDOUT && !is_unregistered()) {
schedule_async_complete(request, r);
+ m_async_op_tracker.finish_op();
+ return;
}
- } else {
- std::unique_lock async_request_locker{m_async_request_lock};
- m_async_pending.erase(request);
}
+
+ std::unique_lock async_request_locker{m_async_request_lock};
+ m_async_pending.erase(request);
+ m_async_op_tracker.finish_op();
}
template <typename I>