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();
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>
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();
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;
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,
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);