Context *on_finish = nullptr;
static CloseImageRequest* create(librbd::MockImageReplayerImageCtx **image_ctx,
- ContextWQ *work_queue,
+ ContextWQ *work_queue, bool destroy_only,
Context *on_finish) {
assert(s_instance != nullptr);
s_instance->on_finish = on_finish;
template <typename I>
CloseImageRequest<I>::CloseImageRequest(I **image_ctx, ContextWQ *work_queue,
- Context *on_finish)
- : m_image_ctx(image_ctx), m_work_queue(work_queue), m_on_finish(on_finish) {
+ bool destroy_only, Context *on_finish)
+ : m_image_ctx(image_ctx), m_work_queue(work_queue),
+ m_destroy_only(destroy_only), m_on_finish(on_finish) {
}
template <typename I>
template <typename I>
void CloseImageRequest<I>::close_image() {
+ if (m_destroy_only) {
+ switch_thread_context();
+ return;
+ }
+
dout(20) << dendl;
Context *ctx = create_context_callback<
class CloseImageRequest {
public:
static CloseImageRequest* create(ImageCtxT **image_ctx, ContextWQ *work_queue,
- Context *on_finish) {
- return new CloseImageRequest(image_ctx, work_queue, on_finish);
+ bool destroy_only, Context *on_finish) {
+ return new CloseImageRequest(image_ctx, work_queue, destroy_only,
+ on_finish);
}
CloseImageRequest(ImageCtxT **image_ctx, ContextWQ *work_queue,
- Context *on_finish);
+ bool destroy_only, Context *on_finish);
void send();
* <start>
* |
* v
- * CLOSE_IMAGE
+ * CLOSE_IMAGE (skip if not needed)
* |
* v
* SWITCH_CONTEXT
*/
ImageCtxT **m_image_ctx;
ContextWQ *m_work_queue;
+ bool m_destroy_only;
Context *m_on_finish;
void close_image();
if (r < 0) {
derr << "failed to open image '" << m_local_image_id << "': "
<< cpp_strerror(r) << dendl;
- send_close_image(r);
+ send_close_image(true, r);
return;
} else if ((*m_local_image_ctx)->exclusive_lock == nullptr) {
derr << "image does not support exclusive lock" << dendl;
- send_close_image(-EINVAL);
+ send_close_image(false, -EINVAL);
return;
}
if (r < 0) {
derr << "failed to lock image '" << m_local_image_id << "': "
<< cpp_strerror(r) << dendl;
- send_close_image(r);
+ send_close_image(false, r);
return;
} else if ((*m_local_image_ctx)->exclusive_lock == nullptr ||
!(*m_local_image_ctx)->exclusive_lock->is_lock_owner()) {
derr << "image is not locked" << dendl;
- send_close_image(-EBUSY);
+ send_close_image(false, -EBUSY);
return;
}
}
template <typename I>
-void OpenLocalImageRequest<I>::send_close_image(int r) {
+void OpenLocalImageRequest<I>::send_close_image(bool destroy_only, int r) {
dout(20) << dendl;
if (m_ret_val == 0 && r < 0) {
OpenLocalImageRequest<I>, &OpenLocalImageRequest<I>::handle_close_image>(
this);
CloseImageRequest<I> *request = CloseImageRequest<I>::create(
- m_local_image_ctx, m_work_queue, ctx);
+ m_local_image_ctx, m_work_queue, destroy_only, ctx);
request->send();
}
void send_lock_image();
void handle_lock_image(int r);
- void send_close_image(int r);
+ void send_close_image(bool destroy_only, int r);
void handle_close_image(int r);
void finish(int r);