]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
librbd: deep_copy: don't create snapshots above snap_id_end
authorMykola Golub <to.my.trociny@gmail.com>
Thu, 7 Dec 2017 11:09:49 +0000 (13:09 +0200)
committerMykola Golub <to.my.trociny@gmail.com>
Thu, 7 Dec 2017 22:16:58 +0000 (00:16 +0200)
Signed-off-by: Mykola Golub <to.my.trociny@gmail.com>
src/librbd/DeepCopyRequest.cc
src/librbd/deep_copy/SnapshotCopyRequest.cc
src/librbd/deep_copy/SnapshotCopyRequest.h
src/test/librbd/deep_copy/test_mock_SnapshotCopyRequest.cc
src/test/librbd/test_mock_DeepCopyRequest.cc

index 268a45954924102b491f839846b99287f1ad359c..9c10724e571735fd617637ea65118ba262862042 100644 (file)
@@ -91,7 +91,8 @@ void DeepCopyRequest<I>::send_copy_snapshots() {
   Context *ctx = create_context_callback<
     DeepCopyRequest<I>, &DeepCopyRequest<I>::handle_copy_snapshots>(this);
   m_snapshot_copy_request = SnapshotCopyRequest<I>::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();
 
index 517b789faa67bda595ef09c240797fb1facabc0d..fbd726838ebc0f4bd6fd9ae6874562954c814bef 100644 (file)
@@ -41,19 +41,24 @@ using librbd::util::unique_lock_name;
 template <typename I>
 SnapshotCopyRequest<I>::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 <typename I>
index 825e2d338e66f4e398f8d1347a3ee095d79b5163..6c5c521d1dd60b0487437556a6cc80d13155cb61 100644 (file)
@@ -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;
index a8e90efdcb8a707a5af0fcdb483d9d35c1240c94..8ba7d82b83e55f8c0649f4c6b8e538b74f6da6c1 100644 (file)
@@ -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,
index dbc63b5ea76a5ba88b5ba5fbed3c618ca69634e9..bc3542296d76e4352ddf5c4a5bb46ebee76bbc91 100644 (file)
@@ -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);