Context *on_finish = nullptr;
static CloseImageRequest* create(librbd::MockTestImageCtx **image_ctx,
- ContextWQ *work_queue, bool destroy_only,
Context *on_finish) {
assert(s_instance != nullptr);
s_instance->image_ctx = image_ctx;
static OpenImageRequest* create(librados::IoCtx &io_ctx,
librbd::MockTestImageCtx **image_ctx,
const std::string &image_id,
- bool read_only, ContextWQ *work_queue,
- Context *on_finish) {
+ bool read_only, Context *on_finish) {
assert(s_instance != nullptr);
s_instance->image_ctx = image_ctx;
s_instance->on_finish = on_finish;
Context *on_finish = nullptr;
static CloseImageRequest* create(librbd::MockTestImageCtx **image_ctx,
- ContextWQ *work_queue, bool destroy_only,
Context *on_finish) {
assert(s_instance != nullptr);
s_instance->construct(*image_ctx);
static OpenImageRequest* create(librados::IoCtx &io_ctx,
librbd::MockTestImageCtx **image_ctx,
const std::string &image_id,
- bool read_only, ContextWQ *work_queue,
- Context *on_finish) {
+ bool read_only, Context *on_finish) {
assert(s_instance != nullptr);
s_instance->image_ctx = image_ctx;
s_instance->on_finish = on_finish;
Context *on_finish = nullptr;
static CloseImageRequest* create(librbd::MockTestImageCtx **image_ctx,
- ContextWQ *work_queue, bool destroy_only,
Context *on_finish) {
assert(s_instance != nullptr);
s_instance->image_ctx = image_ctx;
if (m_local_image_ctx) {
ctx = new FunctionContext([this, ctx](int r) {
CloseImageRequest<I> *request = CloseImageRequest<I>::create(
- &m_local_image_ctx, m_threads->work_queue, false, ctx);
+ &m_local_image_ctx, ctx);
request->send();
});
}
this);
OpenImageRequest<I> *request = OpenImageRequest<I>::create(
m_remote_io_ctx, &m_remote_image_ctx, m_remote_image_id, false,
- m_work_queue, ctx);
+ ctx);
request->send();
}
BootstrapRequest<I>, &BootstrapRequest<I>::handle_close_local_image>(
this);
CloseImageRequest<I> *request = CloseImageRequest<I>::create(
- m_local_image_ctx, m_work_queue, false, ctx);
+ m_local_image_ctx, ctx);
request->send();
}
BootstrapRequest<I>, &BootstrapRequest<I>::handle_close_remote_image>(
this);
CloseImageRequest<I> *request = CloseImageRequest<I>::create(
- &m_remote_image_ctx, m_work_queue, false, ctx);
+ &m_remote_image_ctx, ctx);
request->send();
}
using librbd::util::create_context_callback;
template <typename I>
-CloseImageRequest<I>::CloseImageRequest(I **image_ctx, ContextWQ *work_queue,
- 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) {
+CloseImageRequest<I>::CloseImageRequest(I **image_ctx, Context *on_finish)
+ : m_image_ctx(image_ctx), 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<
<< dendl;
}
- switch_thread_context();
-}
-
-template <typename I>
-void CloseImageRequest<I>::switch_thread_context() {
- dout(20) << dendl;
-
- // swap the librbd thread context for the rbd-mirror thread context
- Context *ctx = create_context_callback<
- CloseImageRequest<I>, &CloseImageRequest<I>::handle_switch_thread_context>(
- this);
- m_work_queue->queue(ctx, 0);
-}
-
-template <typename I>
-void CloseImageRequest<I>::handle_switch_thread_context(int r) {
- dout(20) << dendl;
-
- assert(r == 0);
-
delete *m_image_ctx;
*m_image_ctx = nullptr;
#include <string>
class Context;
-class ContextWQ;
namespace librbd { class ImageCtx; }
namespace rbd {
template <typename ImageCtxT = librbd::ImageCtx>
class CloseImageRequest {
public:
- static CloseImageRequest* create(ImageCtxT **image_ctx, ContextWQ *work_queue,
- bool destroy_only, Context *on_finish) {
- return new CloseImageRequest(image_ctx, work_queue, destroy_only,
- on_finish);
+ static CloseImageRequest* create(ImageCtxT **image_ctx, Context *on_finish) {
+ return new CloseImageRequest(image_ctx, on_finish);
}
- CloseImageRequest(ImageCtxT **image_ctx, ContextWQ *work_queue,
- bool destroy_only, Context *on_finish);
+ CloseImageRequest(ImageCtxT **image_ctx, Context *on_finish);
void send();
* <start>
* |
* v
- * CLOSE_IMAGE (skip if not needed)
- * |
- * v
- * SWITCH_CONTEXT
+ * CLOSE_IMAGE
* |
* v
* <finish>
* @endverbatim
*/
ImageCtxT **m_image_ctx;
- ContextWQ *m_work_queue;
- bool m_destroy_only;
Context *m_on_finish;
void close_image();
void handle_close_image(int r);
-
- void switch_thread_context();
- void handle_switch_thread_context(int r);
};
} // namespace image_replayer
&CreateImageRequest<I>::handle_open_remote_parent_image>(this);
OpenImageRequest<I> *request = OpenImageRequest<I>::create(
m_remote_parent_io_ctx, &m_remote_parent_image_ctx,
- m_remote_parent_spec.image_id, true, m_work_queue, ctx);
+ m_remote_parent_spec.image_id, true, ctx);
request->send();
}
CreateImageRequest<I>,
&CreateImageRequest<I>::handle_open_local_parent_image>(this);
OpenImageRequest<I> *request = OpenImageRequest<I>::create(
- m_local_parent_io_ctx, &m_local_parent_image_ctx, m_local_parent_spec.image_id,
- true, m_work_queue, ctx);
+ m_local_parent_io_ctx, &m_local_parent_image_ctx,
+ m_local_parent_spec.image_id, true, ctx);
request->send();
}
CreateImageRequest<I>,
&CreateImageRequest<I>::handle_close_local_parent_image>(this);
CloseImageRequest<I> *request = CloseImageRequest<I>::create(
- &m_local_parent_image_ctx, m_work_queue, false, ctx);
+ &m_local_parent_image_ctx, ctx);
request->send();
}
CreateImageRequest<I>,
&CreateImageRequest<I>::handle_close_remote_parent_image>(this);
CloseImageRequest<I> *request = CloseImageRequest<I>::create(
- &m_remote_parent_image_ctx, m_work_queue, false, ctx);
+ &m_remote_parent_image_ctx, ctx);
request->send();
}
// vim: ts=8 sw=2 smarttab
#include "OpenImageRequest.h"
-#include "CloseImageRequest.h"
#include "common/errno.h"
-#include "common/WorkQueue.h"
#include "librbd/ImageCtx.h"
#include "librbd/ImageState.h"
#include "librbd/Utils.h"
template <typename I>
OpenImageRequest<I>::OpenImageRequest(librados::IoCtx &io_ctx, I **image_ctx,
const std::string &image_id,
- bool read_only, ContextWQ *work_queue,
- Context *on_finish)
+ bool read_only, Context *on_finish)
: m_io_ctx(io_ctx), m_image_ctx(image_ctx), m_image_id(image_id),
- m_read_only(read_only), m_work_queue(work_queue), m_on_finish(on_finish) {
+ m_read_only(read_only), m_on_finish(on_finish) {
}
template <typename I>
if (r < 0) {
derr << ": failed to open image '" << m_image_id << "': "
<< cpp_strerror(r) << dendl;
- send_close_image(r);
- return;
+ (*m_image_ctx)->destroy();
+ *m_image_ctx = nullptr;
}
- finish(0);
-}
-
-template <typename I>
-void OpenImageRequest<I>::send_close_image(int r) {
- dout(20) << dendl;
-
- if (m_ret_val == 0 && r < 0) {
- m_ret_val = r;
- }
-
- Context *ctx = create_context_callback<
- OpenImageRequest<I>, &OpenImageRequest<I>::handle_close_image>(
- this);
- CloseImageRequest<I> *request = CloseImageRequest<I>::create(
- m_image_ctx, m_work_queue, true, ctx);
- request->send();
-}
-
-template <typename I>
-void OpenImageRequest<I>::handle_close_image(int r) {
- dout(20) << dendl;
-
- assert(r == 0);
- finish(m_ret_val);
+ finish(r);
}
template <typename I>
#include <string>
class Context;
-class ContextWQ;
namespace librbd { class ImageCtx; }
namespace rbd {
static OpenImageRequest* create(librados::IoCtx &io_ctx,
ImageCtxT **image_ctx,
const std::string &image_id,
- bool read_only, ContextWQ *work_queue,
- Context *on_finish) {
+ bool read_only, Context *on_finish) {
return new OpenImageRequest(io_ctx, image_ctx, image_id, read_only,
- work_queue, on_finish);
+ on_finish);
}
OpenImageRequest(librados::IoCtx &io_ctx, ImageCtxT **image_ctx,
const std::string &image_id, bool read_only,
- ContextWQ *m_work_queue, Context *on_finish);
+ Context *on_finish);
void send();
* <start>
* |
* v
- * OPEN_IMAGE * * * * * * * *
- * | *
- * v v
- * <finish> <---------- CLOSE_IMAGE
+ * OPEN_IMAGE
+ * |
+ * v
+ * <finish>
*
* @endverbatim
*/
ImageCtxT **m_image_ctx;
std::string m_image_id;
bool m_read_only;
- ContextWQ *m_work_queue;
Context *m_on_finish;
- int m_ret_val = 0;
-
void send_open_image();
void handle_open_image(int r);
if (r < 0) {
derr << ": failed to open image '" << m_local_image_id << "': "
<< cpp_strerror(r) << dendl;
- send_close_image(true, r);
+ (*m_local_image_ctx)->destroy();
+ *m_local_image_ctx = nullptr;
+ finish(r);
return;
}
if (r < 0) {
derr << ": error querying local image primary status: " << cpp_strerror(r)
<< dendl;
- send_close_image(false, r);
+ send_close_image(r);
return;
}
// we aren't going to mirror peer data into this image anyway
if (m_primary) {
dout(10) << ": local image is primary -- skipping image replay" << dendl;
- send_close_image(false, -EREMOTEIO);
+ send_close_image(-EREMOTEIO);
return;
}
RWLock::RLocker owner_locker((*m_local_image_ctx)->owner_lock);
if ((*m_local_image_ctx)->exclusive_lock == nullptr) {
derr << ": image does not support exclusive lock" << dendl;
- send_close_image(false, -EINVAL);
+ send_close_image(-EINVAL);
return;
}
if (r < 0) {
derr << ": failed to lock image '" << m_local_image_id << "': "
<< cpp_strerror(r) << dendl;
- send_close_image(false, r);
+ send_close_image(r);
return;
}
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(false, -EBUSY);
+ send_close_image(-EBUSY);
return;
}
}
}
template <typename I>
-void OpenLocalImageRequest<I>::send_close_image(bool destroy_only, int r) {
+void OpenLocalImageRequest<I>::send_close_image(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, destroy_only, ctx);
+ m_local_image_ctx, ctx);
request->send();
}
void send_lock_image();
void handle_lock_image(int r);
- void send_close_image(bool destroy_only, int r);
+ void send_close_image(int r);
void handle_close_image(int r);
void finish(int r);