From: Mykola Golub Date: Thu, 7 Dec 2017 11:09:49 +0000 (+0200) Subject: librbd: deep_copy: don't create snapshots above snap_id_end X-Git-Tag: v13.0.2~832^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=644c319181f815624836d58decba6b94dba91215;p=ceph.git librbd: deep_copy: don't create snapshots above snap_id_end Signed-off-by: Mykola Golub --- diff --git a/src/librbd/DeepCopyRequest.cc b/src/librbd/DeepCopyRequest.cc index 268a45954924..9c10724e5717 100644 --- a/src/librbd/DeepCopyRequest.cc +++ b/src/librbd/DeepCopyRequest.cc @@ -91,7 +91,8 @@ void DeepCopyRequest::send_copy_snapshots() { Context *ctx = create_context_callback< DeepCopyRequest, &DeepCopyRequest::handle_copy_snapshots>(this); m_snapshot_copy_request = SnapshotCopyRequest::create( - m_src_image_ctx, m_dst_image_ctx, m_work_queue, m_snap_seqs, ctx); + m_src_image_ctx, m_dst_image_ctx, m_snap_id_end, m_work_queue, m_snap_seqs, + ctx); m_snapshot_copy_request->get(); m_lock.Unlock(); diff --git a/src/librbd/deep_copy/SnapshotCopyRequest.cc b/src/librbd/deep_copy/SnapshotCopyRequest.cc index 517b789faa67..fbd726838ebc 100644 --- a/src/librbd/deep_copy/SnapshotCopyRequest.cc +++ b/src/librbd/deep_copy/SnapshotCopyRequest.cc @@ -41,19 +41,24 @@ using librbd::util::unique_lock_name; template SnapshotCopyRequest::SnapshotCopyRequest(I *src_image_ctx, I *dst_image_ctx, + librados::snap_t snap_id_end, ContextWQ *work_queue, SnapSeqs *snap_seqs, Context *on_finish) : RefCountedObject(dst_image_ctx->cct, 1), m_src_image_ctx(src_image_ctx), - m_dst_image_ctx(dst_image_ctx), m_work_queue(work_queue), - m_snap_seqs_result(snap_seqs), m_snap_seqs(*snap_seqs), - m_on_finish(on_finish), m_cct(dst_image_ctx->cct), + m_dst_image_ctx(dst_image_ctx), m_snap_id_end(snap_id_end), + m_work_queue(work_queue), m_snap_seqs_result(snap_seqs), + m_snap_seqs(*snap_seqs), m_on_finish(on_finish), m_cct(dst_image_ctx->cct), m_lock(unique_lock_name("SnapshotCopyRequest::m_lock", this)) { // snap ids ordered from oldest to newest m_src_snap_ids.insert(src_image_ctx->snaps.begin(), src_image_ctx->snaps.end()); m_dst_snap_ids.insert(dst_image_ctx->snaps.begin(), dst_image_ctx->snaps.end()); + if (m_snap_id_end != CEPH_NOSNAP) { + m_src_snap_ids.erase(m_src_snap_ids.upper_bound(m_snap_id_end), + m_src_snap_ids.end()); + } } template diff --git a/src/librbd/deep_copy/SnapshotCopyRequest.h b/src/librbd/deep_copy/SnapshotCopyRequest.h index 825e2d338e66..6c5c521d1dd6 100644 --- a/src/librbd/deep_copy/SnapshotCopyRequest.h +++ b/src/librbd/deep_copy/SnapshotCopyRequest.h @@ -25,16 +25,17 @@ class SnapshotCopyRequest : public RefCountedObject { public: static SnapshotCopyRequest* create(ImageCtxT *src_image_ctx, ImageCtxT *dst_image_ctx, + librados::snap_t snap_id_end, ContextWQ *work_queue, SnapSeqs *snap_seqs, Context *on_finish) { - return new SnapshotCopyRequest(src_image_ctx, dst_image_ctx, work_queue, - snap_seqs, on_finish); + return new SnapshotCopyRequest(src_image_ctx, dst_image_ctx, snap_id_end, + work_queue, snap_seqs, on_finish); } SnapshotCopyRequest(ImageCtxT *src_image_ctx, ImageCtxT *dst_image_ctx, - ContextWQ *work_queue, SnapSeqs *snap_seqs, - Context *on_finish); + librados::snap_t snap_id_end, ContextWQ *work_queue, + SnapSeqs *snap_seqs, Context *on_finish); void send(); void cancel(); @@ -75,6 +76,7 @@ private: ImageCtxT *m_src_image_ctx; ImageCtxT *m_dst_image_ctx; + librados::snap_t m_snap_id_end; ContextWQ *m_work_queue; SnapSeqs *m_snap_seqs_result; SnapSeqs m_snap_seqs; diff --git a/src/test/librbd/deep_copy/test_mock_SnapshotCopyRequest.cc b/src/test/librbd/deep_copy/test_mock_SnapshotCopyRequest.cc index a8e90efdcb8a..8ba7d82b83e5 100644 --- a/src/test/librbd/deep_copy/test_mock_SnapshotCopyRequest.cc +++ b/src/test/librbd/deep_copy/test_mock_SnapshotCopyRequest.cc @@ -190,7 +190,8 @@ public: librbd::MockTestImageCtx &mock_src_image_ctx, librbd::MockTestImageCtx &mock_dst_image_ctx, Context *on_finish) { return new MockSnapshotCopyRequest(&mock_src_image_ctx, &mock_dst_image_ctx, - m_work_queue, &m_snap_seqs, on_finish); + CEPH_NOSNAP, m_work_queue, &m_snap_seqs, + on_finish); } int create_snap(librbd::ImageCtx *image_ctx, const std::string &snap_name, diff --git a/src/test/librbd/test_mock_DeepCopyRequest.cc b/src/test/librbd/test_mock_DeepCopyRequest.cc index dbc63b5ea76a..bc3542296d76 100644 --- a/src/test/librbd/test_mock_DeepCopyRequest.cc +++ b/src/test/librbd/test_mock_DeepCopyRequest.cc @@ -114,6 +114,7 @@ public: static SnapshotCopyRequest* create(librbd::MockTestImageCtx *src_image_ctx, librbd::MockTestImageCtx *dst_image_ctx, + librados::snap_t snap_id_end, ContextWQ *work_queue, SnapSeqs *snap_seqs, Context *on_finish) { assert(s_instance != nullptr);