bool flatten,
const ObjectNumber &object_number,
ContextWQ *work_queue, SnapSeqs *snap_seqs,
- ProgressContext *prog_ctx,
+ deep_copy::Handler *handler,
Context *on_finish)
: RefCountedObject(dst_image_ctx->cct), m_src_image_ctx(src_image_ctx),
m_dst_image_ctx(dst_image_ctx), m_src_snap_id_start(src_snap_id_start),
m_src_snap_id_end(src_snap_id_end), m_dst_snap_id_start(dst_snap_id_start),
m_flatten(flatten), m_object_number(object_number),
- m_work_queue(work_queue), m_snap_seqs(snap_seqs), m_prog_ctx(prog_ctx),
+ m_work_queue(work_queue), m_snap_seqs(snap_seqs), m_handler(handler),
m_on_finish(on_finish), m_cct(dst_image_ctx->cct),
m_lock(ceph::make_mutex(unique_lock_name("DeepCopyRequest::m_lock", this))) {
}
DeepCopyRequest<I>, &DeepCopyRequest<I>::handle_copy_image>(this);
m_image_copy_request = ImageCopyRequest<I>::create(
m_src_image_ctx, m_dst_image_ctx, m_src_snap_id_start, m_src_snap_id_end,
- m_dst_snap_id_start, m_flatten, m_object_number, *m_snap_seqs, m_prog_ctx,
+ m_dst_snap_id_start, m_flatten, m_object_number, *m_snap_seqs, m_handler,
ctx);
m_image_copy_request->get();
m_lock.unlock();
template <typename> class ImageCopyRequest;
template <typename> class SnapshotCopyRequest;
+struct Handler;
}
const deep_copy::ObjectNumber &object_number,
ContextWQ *work_queue,
SnapSeqs *snap_seqs,
- ProgressContext *prog_ctx,
+ deep_copy::Handler *handler,
Context *on_finish) {
return new DeepCopyRequest(src_image_ctx, dst_image_ctx, src_snap_id_start,
src_snap_id_end, dst_snap_id_start, flatten,
- object_number, work_queue, snap_seqs, prog_ctx,
+ object_number, work_queue, snap_seqs, handler,
on_finish);
}
librados::snap_t dst_snap_id_start,
bool flatten, const deep_copy::ObjectNumber &object_number,
ContextWQ *work_queue, SnapSeqs *snap_seqs,
- ProgressContext *prog_ctx, Context *on_finish);
+ deep_copy::Handler *handler, Context *on_finish);
~DeepCopyRequest();
void send();
deep_copy::ObjectNumber m_object_number;
ContextWQ *m_work_queue;
SnapSeqs *m_snap_seqs;
- ProgressContext *m_prog_ctx;
+ deep_copy::Handler *m_handler;
Context *m_on_finish;
CephContext *m_cct;
#include "librbd/Utils.h"
#include "librbd/api/Config.h"
#include "librbd/api/Trash.h"
+#include "librbd/deep_copy/Handler.h"
#include "librbd/image/CloneRequest.h"
#include "librbd/image/RemoveRequest.h"
#include "librbd/image/PreRemoveRequest.h"
C_SaferCond cond;
SnapSeqs snap_seqs;
- auto req = DeepCopyRequest<I>::create(src, dest, snap_id_start, snap_id_end,
- 0U, flatten, boost::none, op_work_queue,
- &snap_seqs, &prog_ctx, &cond);
+ deep_copy::ProgressHandler progress_handler{&prog_ctx};
+ auto req = DeepCopyRequest<I>::create(
+ src, dest, snap_id_start, snap_id_end, 0U, flatten, boost::none, op_work_queue,
+ &snap_seqs, &progress_handler, &cond);
req->send();
int r = cond.wait();
if (r < 0) {
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#ifndef CEPH_LIBRBD_DEEP_COPY_HANDLER_H
+#define CEPH_LIBRBD_DEEP_COPY_HANDLER_H
+
+#include "include/int_types.h"
+#include "include/rbd/librbd.hpp"
+
+namespace librbd {
+namespace deep_copy {
+
+struct Handler {
+ virtual ~Handler() {}
+
+ virtual int update_progress(uint64_t object_number,
+ uint64_t object_count) = 0;
+};
+
+struct NoOpHandler : public Handler {
+ int update_progress(uint64_t object_number,
+ uint64_t object_count) override {
+ return 0;
+ }
+};
+
+class ProgressHandler : public NoOpHandler {
+public:
+ ProgressHandler(ProgressContext* progress_ctx)
+ : m_progress_ctx(progress_ctx) {
+ }
+
+ int update_progress(uint64_t object_number,
+ uint64_t object_count) override {
+ return m_progress_ctx->update_progress(object_number, object_count);
+ }
+
+private:
+ librbd::ProgressContext* m_progress_ctx;
+};
+
+} // namespace deep_copy
+} // namespace librbd
+
+#endif // CEPH_LIBRBD_DEEP_COPY_HANDLER_H
#include "ObjectCopyRequest.h"
#include "common/errno.h"
#include "librbd/Utils.h"
+#include "librbd/deep_copy/Handler.h"
#include "librbd/deep_copy/Utils.h"
#include "librbd/image/CloseRequest.h"
#include "librbd/image/OpenRequest.h"
bool flatten,
const ObjectNumber &object_number,
const SnapSeqs &snap_seqs,
- ProgressContext *prog_ctx,
+ Handler *handler,
Context *on_finish)
: RefCountedObject(dst_image_ctx->cct), m_src_image_ctx(src_image_ctx),
m_dst_image_ctx(dst_image_ctx), m_src_snap_id_start(src_snap_id_start),
m_src_snap_id_end(src_snap_id_end), m_dst_snap_id_start(dst_snap_id_start),
m_flatten(flatten), m_object_number(object_number), m_snap_seqs(snap_seqs),
- m_prog_ctx(prog_ctx), m_on_finish(on_finish), m_cct(dst_image_ctx->cct),
+ m_handler(handler), m_on_finish(on_finish), m_cct(dst_image_ctx->cct),
m_lock(ceph::make_mutex(unique_lock_name("ImageCopyRequest::m_lock", this))) {
}
uint64_t progress_object_no = *m_object_number + 1;
m_updating_progress = true;
m_lock.unlock();
- m_prog_ctx->update_progress(progress_object_no, m_end_object_no);
+ m_handler->update_progress(progress_object_no, m_end_object_no);
m_lock.lock();
ceph_assert(m_updating_progress);
m_updating_progress = false;
namespace librbd {
class ImageCtx;
-class ProgressContext;
namespace deep_copy {
+class Handler;
+
template <typename ImageCtxT = ImageCtx>
class ImageCopyRequest : public RefCountedObject {
public:
bool flatten,
const ObjectNumber &object_number,
const SnapSeqs &snap_seqs,
- ProgressContext *prog_ctx,
+ Handler *handler,
Context *on_finish) {
return new ImageCopyRequest(src_image_ctx, dst_image_ctx, src_snap_id_start,
src_snap_id_end, dst_snap_id_start, flatten,
- object_number, snap_seqs, prog_ctx, on_finish);
+ object_number, snap_seqs, handler, on_finish);
}
ImageCopyRequest(ImageCtxT *src_image_ctx, ImageCtxT *dst_image_ctx,
librados::snap_t src_snap_id_end,
librados::snap_t dst_snap_id_start,
bool flatten, const ObjectNumber &object_number,
- const SnapSeqs &snap_seqs, ProgressContext *prog_ctx,
+ const SnapSeqs &snap_seqs, Handler *handler,
Context *on_finish);
void send();
bool m_flatten;
ObjectNumber m_object_number;
SnapSeqs m_snap_seqs;
- ProgressContext *m_prog_ctx;
+ Handler *m_handler;
Context *m_on_finish;
CephContext *m_cct;
#include "librbd/ImageState.h"
#include "librbd/internal.h"
#include "librbd/Operations.h"
+#include "librbd/deep_copy/Handler.h"
#include "librbd/deep_copy/ImageCopyRequest.h"
#include "librbd/deep_copy/ObjectCopyRequest.h"
#include "librbd/image/CloseRequest.h"
expect_get_image_size(mock_src_image_ctx, 0);
expect_object_copy_send(mock_object_copy_request);
- librbd::NoOpProgressContext no_op;
+ librbd::deep_copy::NoOpHandler no_op;
C_SaferCond ctx;
auto request = new MockImageCopyRequest(&mock_src_image_ctx,
&mock_dst_image_ctx,
expect_get_image_size(mock_src_image_ctx, 1 << m_src_image_ctx->order);
expect_get_image_size(mock_src_image_ctx, 0);
- librbd::NoOpProgressContext no_op;
+ librbd::deep_copy::NoOpHandler no_op;
C_SaferCond ctx;
auto request = new MockImageCopyRequest(&mock_src_image_ctx,
&mock_dst_image_ctx,
EXPECT_CALL(mock_object_copy_request, send()).Times(object_count);
- class ProgressContext : public librbd::ProgressContext {
+ class Handler : public librbd::deep_copy::NoOpHandler {
public:
uint64_t object_count;
librbd::deep_copy::ObjectNumber expected_object_number;
- ProgressContext(uint64_t object_count)
+ Handler(uint64_t object_count)
: object_count(object_count) {
}
return 0;
}
- } prog_ctx(object_count);
+ } handler(object_count);
C_SaferCond ctx;
auto request = new MockImageCopyRequest(&mock_src_image_ctx,
&mock_dst_image_ctx,
0, snap_id_end, 0, false, boost::none,
- m_snap_seqs, &prog_ctx, &ctx);
+ m_snap_seqs, &handler, &ctx);
request->send();
std::map<uint64_t, Context*> copy_contexts;
expect_get_image_size(mock_src_image_ctx, 0);
expect_object_copy_send(mock_object_copy_request);
- librbd::NoOpProgressContext no_op;
+ librbd::deep_copy::NoOpHandler no_op;
C_SaferCond ctx;
auto request = new MockImageCopyRequest(&mock_src_image_ctx,
&mock_dst_image_ctx,
expect_get_image_size(mock_src_image_ctx, 0);
expect_object_copy_send(mock_object_copy_request);
- librbd::NoOpProgressContext no_op;
+ librbd::deep_copy::NoOpHandler no_op;
C_SaferCond ctx;
auto request = new MockImageCopyRequest(&mock_src_image_ctx,
&mock_dst_image_ctx,
expect_get_image_size(mock_src_image_ctx, 0);
expect_object_copy_send(mock_object_copy_request);
- librbd::NoOpProgressContext no_op;
+ librbd::deep_copy::NoOpHandler no_op;
C_SaferCond ctx;
auto request = new MockImageCopyRequest(&mock_src_image_ctx,
&mock_dst_image_ctx,
EXPECT_CALL(mock_object_copy_request, send()).Times(6);
- struct ProgressContext : public librbd::ProgressContext {
+ struct Handler : public librbd::deep_copy::NoOpHandler {
librbd::deep_copy::ObjectNumber object_number;
int update_progress(uint64_t object_no, uint64_t end_object_no) override {
object_number = object_number ? *object_number + 1 : 0;
return 0;
}
- } prog_ctx;
+ } handler;
C_SaferCond ctx;
auto request = new MockImageCopyRequest(&mock_src_image_ctx,
&mock_dst_image_ctx,
0, snap_id_end, 0, false, boost::none,
- m_snap_seqs, &prog_ctx, &ctx);
+ m_snap_seqs, &handler, &ctx);
request->send();
ASSERT_EQ(m_snap_map, wait_for_snap_map(mock_object_copy_request));
cancel_ctx->complete(0);
ASSERT_EQ(-ECANCELED, ctx.wait());
- ASSERT_EQ(5u, prog_ctx.object_number.get());
+ ASSERT_EQ(5u, handler.object_number.get());
}
TEST_F(TestMockDeepCopyImageCopyRequest, MissingSnap) {
librbd::MockTestImageCtx mock_src_image_ctx(*m_src_image_ctx);
librbd::MockTestImageCtx mock_dst_image_ctx(*m_dst_image_ctx);
- librbd::NoOpProgressContext no_op;
+ librbd::deep_copy::NoOpHandler no_op;
C_SaferCond ctx;
auto request = new MockImageCopyRequest(&mock_src_image_ctx,
&mock_dst_image_ctx,
librbd::MockTestImageCtx mock_src_image_ctx(*m_src_image_ctx);
librbd::MockTestImageCtx mock_dst_image_ctx(*m_dst_image_ctx);
- librbd::NoOpProgressContext no_op;
+ librbd::deep_copy::NoOpHandler no_op;
C_SaferCond ctx;
auto request = new MockImageCopyRequest(&mock_src_image_ctx,
&mock_dst_image_ctx,
librbd::MockTestImageCtx mock_src_image_ctx(*m_src_image_ctx);
librbd::MockTestImageCtx mock_dst_image_ctx(*m_dst_image_ctx);
- librbd::NoOpProgressContext no_op;
+ librbd::deep_copy::NoOpHandler no_op;
C_SaferCond ctx;
auto request = new MockImageCopyRequest(&mock_src_image_ctx,
&mock_dst_image_ctx,
librbd::MockTestImageCtx mock_src_image_ctx(*m_src_image_ctx);
librbd::MockTestImageCtx mock_dst_image_ctx(*m_dst_image_ctx);
- librbd::NoOpProgressContext no_op;
+ librbd::deep_copy::NoOpHandler no_op;
C_SaferCond ctx;
auto request = new MockImageCopyRequest(&mock_src_image_ctx,
&mock_dst_image_ctx,
#include "librbd/Operations.h"
#include "librbd/internal.h"
#include "librbd/api/Image.h"
+#include "librbd/deep_copy/Handler.h"
#include "librbd/deep_copy/ImageCopyRequest.h"
#include "librbd/deep_copy/MetadataCopyRequest.h"
#include "librbd/deep_copy/SnapshotCopyRequest.h"
librados::snap_t src_snap_id_end,
librados::snap_t dst_snap_id_start,
bool flatten, const ObjectNumber &object_number,
- const SnapSeqs &snap_seqs, ProgressContext *prog_ctx,
+ const SnapSeqs &snap_seqs, Handler *handler,
Context *on_finish) {
ceph_assert(s_instance != nullptr);
s_instance->on_finish = on_finish;
C_SaferCond ctx;
librbd::SnapSeqs snap_seqs;
- librbd::NoOpProgressContext no_op;
+ librbd::deep_copy::NoOpHandler no_op;
auto request = librbd::DeepCopyRequest<librbd::MockTestImageCtx>::create(
&mock_src_image_ctx, &mock_dst_image_ctx, 0, CEPH_NOSNAP, 0, false,
boost::none, m_work_queue, &snap_seqs, &no_op, &ctx);
C_SaferCond ctx;
librbd::SnapSeqs snap_seqs;
- librbd::NoOpProgressContext no_op;
+ librbd::deep_copy::NoOpHandler no_op;
auto request = librbd::DeepCopyRequest<librbd::MockTestImageCtx>::create(
&mock_src_image_ctx, &mock_dst_image_ctx, 0, CEPH_NOSNAP, 0, false,
boost::none, m_work_queue, &snap_seqs, &no_op, &ctx);
C_SaferCond ctx;
librbd::SnapSeqs snap_seqs;
- librbd::NoOpProgressContext no_op;
+ librbd::deep_copy::NoOpHandler no_op;
auto request = librbd::DeepCopyRequest<librbd::MockTestImageCtx>::create(
&mock_src_image_ctx, &mock_dst_image_ctx, 0, CEPH_NOSNAP, 0, false,
boost::none, m_work_queue, &snap_seqs, &no_op, &ctx);
C_SaferCond ctx;
librbd::SnapSeqs snap_seqs;
- librbd::NoOpProgressContext no_op;
+ librbd::deep_copy::NoOpHandler no_op;
auto request = librbd::DeepCopyRequest<librbd::MockTestImageCtx>::create(
&mock_src_image_ctx, &mock_dst_image_ctx, 0, CEPH_NOSNAP, 0, false,
boost::none, m_work_queue, &snap_seqs, &no_op, &ctx);
C_SaferCond ctx;
librbd::SnapSeqs snap_seqs;
- librbd::NoOpProgressContext no_op;
+ librbd::deep_copy::NoOpHandler no_op;
auto request = librbd::DeepCopyRequest<librbd::MockTestImageCtx>::create(
&mock_src_image_ctx, &mock_dst_image_ctx, 0, CEPH_NOSNAP, 0, false,
boost::none, m_work_queue, &snap_seqs, &no_op, &ctx);
C_SaferCond ctx;
librbd::SnapSeqs snap_seqs = {{m_src_image_ctx->snap_id, 123}};
- librbd::NoOpProgressContext no_op;
+ librbd::deep_copy::NoOpHandler no_op;
auto request = librbd::DeepCopyRequest<librbd::MockTestImageCtx>::create(
&mock_src_image_ctx, &mock_dst_image_ctx, 0, m_src_image_ctx->snap_id,
0, false, boost::none, m_work_queue, &snap_seqs, &no_op, &ctx);
C_SaferCond ctx;
librbd::SnapSeqs snap_seqs = {{m_src_image_ctx->snap_id, 123}};
- librbd::NoOpProgressContext no_op;
+ librbd::deep_copy::NoOpHandler no_op;
auto request = librbd::DeepCopyRequest<librbd::MockTestImageCtx>::create(
&mock_src_image_ctx, &mock_dst_image_ctx, 0, m_src_image_ctx->snap_id,
0, false, boost::none, m_work_queue, &snap_seqs, &no_op, &ctx);
bool flatten,
const ObjectNumber &object_number,
const SnapSeqs &snap_seqs,
- ProgressContext *prog_ctx,
+ Handler *handler,
Context *on_finish) {
ceph_assert(s_instance != nullptr);
s_instance->src_snap_id_start = src_snap_id_start;
librados::snap_t src_snap_id_start, librados::snap_t src_snap_id_end,
librados::snap_t dst_snap_id_start, bool flatten,
const librbd::deep_copy::ObjectNumber &object_number,
- ContextWQ *work_queue, SnapSeqs *snap_seqs, ProgressContext *prog_ctx,
+ ContextWQ *work_queue, SnapSeqs *snap_seqs, deep_copy::Handler *handler,
Context *on_finish) {
ceph_assert(s_instance != nullptr);
s_instance->on_finish = on_finish;
} // namespace librbd
// template definitions
-template class rbd::mirror::ImageSync<librbd::MockTestImageCtx>;
#include "tools/rbd_mirror/ImageSync.cc"
namespace rbd {
#include "librbd/ImageState.h"
#include "librbd/Utils.h"
#include "librbd/internal.h"
+#include "librbd/deep_copy/Handler.h"
#include "tools/rbd_mirror/Threads.h"
#include "tools/rbd_mirror/image_sync/SyncPointCreateRequest.h"
#include "tools/rbd_mirror/image_sync/SyncPointPruneRequest.h"
using librbd::util::unique_lock_name;
template <typename I>
-class ImageSync<I>::ImageCopyProgressContext : public librbd::ProgressContext {
+class ImageSync<I>::ImageCopyProgressHandler
+ : public librbd::deep_copy::NoOpHandler {
public:
- ImageCopyProgressContext(ImageSync *image_sync) : image_sync(image_sync) {
+ ImageCopyProgressHandler(ImageSync *image_sync) : image_sync(image_sync) {
}
int update_progress(uint64_t object_no, uint64_t object_count) override {
template <typename I>
ImageSync<I>::~ImageSync() {
ceph_assert(m_image_copy_request == nullptr);
- ceph_assert(m_image_copy_prog_ctx == nullptr);
+ ceph_assert(m_image_copy_prog_handler == nullptr);
ceph_assert(m_update_sync_ctx == nullptr);
}
Context *ctx = create_context_callback<
ImageSync<I>, &ImageSync<I>::handle_copy_image>(this);
- m_image_copy_prog_ctx = new ImageCopyProgressContext(this);
+ m_image_copy_prog_handler = new ImageCopyProgressHandler(this);
m_image_copy_request = librbd::DeepCopyRequest<I>::create(
m_remote_image_ctx, m_local_image_ctx, snap_id_start, snap_id_end,
0, false, object_number, m_threads->work_queue, &m_snap_seqs_copy,
- m_image_copy_prog_ctx, ctx);
+ m_image_copy_prog_handler, ctx);
m_image_copy_request->get();
m_lock.unlock();
std::scoped_lock locker{m_threads->timer_lock, m_lock};
m_image_copy_request->put();
m_image_copy_request = nullptr;
- delete m_image_copy_prog_ctx;
- m_image_copy_prog_ctx = nullptr;
+ delete m_image_copy_prog_handler;
+ m_image_copy_prog_handler = nullptr;
if (r == 0 && m_canceled) {
r = -ECANCELED;
}
class Context;
class ContextWQ;
namespace journal { class Journaler; }
-namespace librbd { class ProgressContext; }
namespace librbd { template <typename> class DeepCopyRequest; }
namespace rbd {
* @endverbatim
*/
- class ImageCopyProgressContext;
+ class ImageCopyProgressHandler;
Threads<ImageCtxT>* m_threads;
ImageCtxT *m_local_image_ctx;
bool m_canceled = false;
librbd::DeepCopyRequest<ImageCtxT> *m_image_copy_request = nullptr;
- librbd::ProgressContext *m_image_copy_prog_ctx = nullptr;
+ ImageCopyProgressHandler *m_image_copy_prog_handler = nullptr;
bool m_updating_sync_point = false;
Context *m_update_sync_ctx = nullptr;
#include "librbd/ImageCtx.h"
#include "librbd/ImageState.h"
#include "librbd/Utils.h"
+#include "librbd/deep_copy/Handler.h"
#include "librbd/deep_copy/ImageCopyRequest.h"
#include "librbd/deep_copy/SnapshotCopyRequest.h"
#include "librbd/mirror/snapshot/CreateNonPrimaryRequest.h"
};
template <typename I>
-struct Replayer<I>::ProgressContext : public librbd::ProgressContext {
+struct Replayer<I>::DeepCopyHandler : public librbd::deep_copy::Handler {
Replayer *replayer;
- ProgressContext(Replayer* replayer) : replayer(replayer) {
+ DeepCopyHandler(Replayer* replayer) : replayer(replayer) {
}
int update_progress(uint64_t object_number, uint64_t object_count) override {
dout(10) << dendl;
ceph_assert(m_state == STATE_COMPLETE);
ceph_assert(m_update_watch_ctx == nullptr);
- ceph_assert(m_progress_ctx == nullptr);
+ ceph_assert(m_deep_copy_handler == nullptr);
}
template <typename I>
<< m_local_mirror_snap_ns.last_copied_object_number << ", "
<< "snap_seqs=" << m_local_mirror_snap_ns.snap_seqs << dendl;
- m_progress_ctx = new ProgressContext(this);
+ m_deep_copy_handler = new DeepCopyHandler(this);
auto ctx = create_context_callback<
Replayer<I>, &Replayer<I>::handle_copy_image>(this);
auto req = librbd::deep_copy::ImageCopyRequest<I>::create(
librbd::deep_copy::ObjectNumber{
m_local_mirror_snap_ns.last_copied_object_number} :
librbd::deep_copy::ObjectNumber{}),
- m_local_mirror_snap_ns.snap_seqs, m_progress_ctx, ctx);
+ m_local_mirror_snap_ns.snap_seqs, m_deep_copy_handler, ctx);
req->send();
}
void Replayer<I>::handle_copy_image(int r) {
dout(10) << "r=" << r << dendl;
- delete m_progress_ctx;
- m_progress_ctx = nullptr;
+ delete m_deep_copy_handler;
+ m_deep_copy_handler = nullptr;
if (r < 0) {
derr << "failed to copy remote image to local image: " << cpp_strerror(r)
struct C_UpdateWatchCtx;
struct C_TrackedOp;
- struct ProgressContext;
+ struct DeepCopyHandler;
Threads<ImageCtxT>* m_threads;
InstanceWatcher<ImageCtxT>* m_instance_watcher;
cls::rbd::MirrorSnapshotNamespace m_remote_mirror_snap_ns;
librbd::mirror::snapshot::ImageState m_image_state;
- ProgressContext* m_progress_ctx = nullptr;
+ DeepCopyHandler* m_deep_copy_handler = nullptr;
bool m_remote_image_updated = false;
bool m_updating_sync_point = false;