}
std::unique_lock async_request_locker{m_async_request_lock};
- mark_async_request_complete(request);
+ mark_async_request_complete(request, r);
m_async_op_tracker.finish_op();
}
}
template <typename I>
-bool ImageWatcher<I>::mark_async_request_complete(const AsyncRequestId &id) {
+bool ImageWatcher<I>::mark_async_request_complete(const AsyncRequestId &id,
+ int r) {
ceph_assert(ceph_mutex_is_locked(m_async_request_lock));
bool found = m_async_pending.erase(id);
it = m_async_complete_expiration.erase(it);
}
- if (m_async_complete.insert(id).second) {
+ if (m_async_complete.insert({id, r}).second) {
auto expiration_time = now;
expiration_time += 600;
m_async_complete_expiration.insert({expiration_time, id});
*ctx = new RemoteContext(*this, async_request_id, *prog_ctx);
} else {
*new_request = false;
+ auto it = m_async_complete.find(async_request_id);
+ if (it != m_async_complete.end()) {
+ return it->second;
+ }
}
}
return 0;
delete it->second.first;
it->second.first = ack_ctx;
} else {
- m_task_finisher->queue(new C_ResponseMessage(ack_ctx));
+ int r = 0;
+ auto it = m_async_complete.find(request);
+ if (it != m_async_complete.end()) {
+ r = it->second;
+ }
+ m_task_finisher->queue(new C_ResponseMessage(ack_ctx), r);
}
locker.unlock();
return new LambdaContext(
[this, request, timeout](int r) {
auto unquiesce_ctx = new LambdaContext(
- [this, request](int r) {
+ [this, request, ret_val=r](int r) {
if (r == 0) {
ldout(m_image_ctx.cct, 10) << this << " quiesce request "
<< request << " timed out" << dendl;
}
auto on_finish = new LambdaContext(
- [this, request](int r) {
+ [this, request, ret_val](int r) {
std::unique_lock async_request_locker{m_async_request_lock};
- mark_async_request_complete(request);
+ mark_async_request_complete(request, ret_val);
});
m_image_ctx.state->notify_unquiesce(on_finish);
Context *ImageWatcher<I>::prepare_unquiesce_request(const AsyncRequestId &request) {
{
std::unique_lock async_request_locker{m_async_request_lock};
- bool found = mark_async_request_complete(request);
+ bool found = mark_async_request_complete(request, 0);
if (!found) {
ldout(m_image_ctx.cct, 20) << this << " " << request
<< ": not found in pending" << dendl;
ceph::shared_mutex m_async_request_lock;
std::map<watch_notify::AsyncRequestId, AsyncRequest> m_async_requests;
std::set<watch_notify::AsyncRequestId> m_async_pending;
- std::set<watch_notify::AsyncRequestId> m_async_complete;
+ std::map<watch_notify::AsyncRequestId, int> m_async_complete;
std::set<std::pair<utime_t,
watch_notify::AsyncRequestId>> m_async_complete_expiration;
void notify_lock_owner(watch_notify::Payload *payload, Context *on_finish);
bool is_new_request(const watch_notify::AsyncRequestId &id) const;
- bool mark_async_request_complete(const watch_notify::AsyncRequestId &id);
+ bool mark_async_request_complete(const watch_notify::AsyncRequestId &id,
+ int r);
Context *remove_async_request(const watch_notify::AsyncRequestId &id);
void schedule_async_request_timed_out(const watch_notify::AsyncRequestId &id);
void async_request_timed_out(const watch_notify::AsyncRequestId &id);