RemoteAsyncRequest request;
::decode(request, iter);
+ bool new_request;
+ {
+ RWLock::WLocker l(m_async_request_lock);
+ new_request = (m_async_pending.count(request) == 0);
+ if (new_request) {
+ m_async_pending.insert(request);
+ }
+ }
+
int r = 0;
- RWLock::WLocker l(m_async_request_lock);
- if (m_async_pending.count(request) == 0) {
+ if (new_request) {
RemoteProgressContext *prog_ctx =
new RemoteProgressContext(*this, request);
RemoteContext *ctx = new RemoteContext(*this, request, prog_ctx);
delete ctx;
lderr(m_image_ctx.cct) << "remove flatten request failed: "
<< cpp_strerror(r) << dendl;
- } else {
- m_async_pending.insert(request);
+
+ RWLock::WLocker l(m_async_request_lock);
+ m_async_pending.erase(request);
}
}
RemoteAsyncRequest request;
::decode(request, iter);
+ bool new_request;
+ {
+ RWLock::WLocker l(m_async_request_lock);
+ new_request = (m_async_pending.count(request) == 0);
+ if (new_request) {
+ m_async_pending.insert(request);
+ }
+ }
+
int r = 0;
- RWLock::WLocker l(m_async_request_lock);
- if (m_async_pending.count(request) == 0) {
+ if (new_request) {
RemoteProgressContext *prog_ctx =
new RemoteProgressContext(*this, request);
RemoteContext *ctx = new RemoteContext(*this, request, prog_ctx);
lderr(m_image_ctx.cct) << "remove resize request failed: "
<< cpp_strerror(r) << dendl;
delete ctx;
- } else {
- m_async_pending.insert(request);
+
+ RWLock::WLocker l(m_async_request_lock);
+ m_async_pending.erase(request);
}
}
m_image_ctx.md_ctx.notify_ack(m_image_ctx.header_oid, notify_id, handle, out);
}
+void ImageWatcher::schedule_reregister_watch() {
+ Mutex::Locker l(m_timer_lock);
+ Context *ctx = new FunctionContext(boost::bind(
+ &ImageWatcher::reregister_watch, this));
+ m_timer->add_event_after(RETRY_DELAY_SECONDS, ctx);
+}
+
void ImageWatcher::reregister_watch() {
ldout(m_image_ctx.cct, 10) << "re-registering image watch" << dendl;
if (r < 0) {
lderr(m_image_ctx.cct) << "failed to re-register image watch: "
<< cpp_strerror(r) << dendl;
- Mutex::Locker l(m_timer_lock);
- FunctionContext *ctx = new FunctionContext(boost::bind(
- &ImageWatcher::reregister_watch, this));
- m_timer->add_event_after(RETRY_DELAY_SECONDS, ctx);
+ if (r != -ESHUTDOWN) {
+ FunctionContext *ctx = new FunctionContext(boost::bind(
+ &ImageWatcher::schedule_reregister_watch, this));
+ m_finisher->queue(ctx);
+ }
return;
}