template <typename I>
SetSnapRequest<I>::~SetSnapRequest() {
+ assert(!m_writes_blocked);
delete m_refresh_parent;
delete m_object_map;
delete m_exclusive_lock;
- if (m_writes_blocked) {
- m_image_ctx.aio_work_queue->unblock_writes();
- }
}
template <typename I>
if (*result < 0) {
lderr(cct) << "failed to initialize exclusive lock: "
<< cpp_strerror(*result) << dendl;
+ finalize();
return m_on_finish;
}
return send_refresh_parent(result);
if (*result < 0) {
lderr(cct) << "failed to block writes: " << cpp_strerror(*result)
<< dendl;
+ finalize();
return m_on_finish;
}
<< dendl;
*result = -ENOENT;
+ finalize();
return m_on_finish;
}
}
if (*result < 0) {
lderr(cct) << "failed to shut down exclusive lock: "
<< cpp_strerror(*result) << dendl;
+ finalize();
return m_on_finish;
}
if (parent_info == nullptr) {
*result = -ENOENT;
lderr(cct) << "failed to retrieve snapshot parent info" << dendl;
+ finalize();
return m_on_finish;
}
if (m_snap_id == CEPH_NOSNAP) {
// object map is loaded when exclusive lock is acquired
*result = apply();
+ finalize();
return m_on_finish;
} else {
// load snapshot object map
if (*result < 0) {
lderr(cct) << "failed to refresh snapshot parent: " << cpp_strerror(*result)
<< dendl;
+ finalize();
return m_on_finish;
}
// object map is loaded when exclusive lock is acquired
*result = apply();
if (*result < 0) {
+ finalize();
return m_on_finish;
}
if (!m_image_ctx.test_features(RBD_FEATURE_OBJECT_MAP)) {
*result = apply();
if (*result < 0) {
+ finalize();
return m_on_finish;
}
*result = apply();
if (*result < 0) {
+ finalize();
return m_on_finish;
}
template <typename I>
Context *SetSnapRequest<I>::send_finalize_refresh_parent(int *result) {
if (m_refresh_parent == nullptr) {
+ finalize();
return m_on_finish;
}
lderr(cct) << "failed to close parent image: " << cpp_strerror(*result)
<< dendl;
}
+ finalize();
return m_on_finish;
}
return 0;
}
+template <typename I>
+void SetSnapRequest<I>::finalize() {
+ if (m_writes_blocked) {
+ m_image_ctx.aio_work_queue->unblock_writes();
+ m_writes_blocked = false;
+ }
+}
+
template <typename I>
void SetSnapRequest<I>::send_complete() {
+ finalize();
m_on_finish->complete(0);
delete this;
}