X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fceph%2Fsrc%2Ftools%2Frbd_mirror%2Fimage_sync%2FImageCopyRequest.h;fp=src%2Fceph%2Fsrc%2Ftools%2Frbd_mirror%2Fimage_sync%2FImageCopyRequest.h;h=4be826aa127ae1818cf3dacc66b38db2f009ef73;hb=812ff6ca9fcd3e629e49d4328905f33eee8ca3f5;hp=0000000000000000000000000000000000000000;hpb=15280273faafb77777eab341909a3f495cf248d9;p=stor4nfv.git diff --git a/src/ceph/src/tools/rbd_mirror/image_sync/ImageCopyRequest.h b/src/ceph/src/tools/rbd_mirror/image_sync/ImageCopyRequest.h new file mode 100644 index 0000000..4be826a --- /dev/null +++ b/src/ceph/src/tools/rbd_mirror/image_sync/ImageCopyRequest.h @@ -0,0 +1,133 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#ifndef RBD_MIRROR_IMAGE_SYNC_IMAGE_COPY_REQUEST_H +#define RBD_MIRROR_IMAGE_SYNC_IMAGE_COPY_REQUEST_H + +#include "include/int_types.h" +#include "include/rados/librados.hpp" +#include "common/Mutex.h" +#include "librbd/journal/Types.h" +#include "librbd/journal/TypeTraits.h" +#include "tools/rbd_mirror/BaseRequest.h" +#include +#include + +class Context; +class SafeTimer; +namespace journal { class Journaler; } +namespace librbd { struct ImageCtx; } + +namespace rbd { +namespace mirror { + +class ProgressContext; + +namespace image_sync { + +template +class ImageCopyRequest : public BaseRequest { +public: + typedef std::vector SnapIds; + typedef std::map SnapMap; + typedef librbd::journal::TypeTraits TypeTraits; + typedef typename TypeTraits::Journaler Journaler; + typedef librbd::journal::MirrorPeerSyncPoint MirrorPeerSyncPoint; + typedef librbd::journal::MirrorPeerClientMeta MirrorPeerClientMeta; + typedef rbd::mirror::ProgressContext ProgressContext; + + static ImageCopyRequest* create(ImageCtxT *local_image_ctx, + ImageCtxT *remote_image_ctx, + SafeTimer *timer, Mutex *timer_lock, + Journaler *journaler, + MirrorPeerClientMeta *client_meta, + MirrorPeerSyncPoint *sync_point, + Context *on_finish, + ProgressContext *progress_ctx = nullptr) { + return new ImageCopyRequest(local_image_ctx, remote_image_ctx, timer, + timer_lock, journaler, client_meta, sync_point, + on_finish, progress_ctx); + } + + ImageCopyRequest(ImageCtxT *local_image_ctx, ImageCtxT *remote_image_ctx, + SafeTimer *timer, Mutex *timer_lock, Journaler *journaler, + MirrorPeerClientMeta *client_meta, + MirrorPeerSyncPoint *sync_point, Context *on_finish, + ProgressContext *progress_ctx = nullptr); + + void send() override; + void cancel() override; + +private: + /** + * @verbatim + * + * + * | + * v + * UPDATE_MAX_OBJECT_COUNT + * | + * | . . . . . + * | . . (parallel execution of + * v v . multiple objects at once) + * COPY_OBJECT . . + * | + * v + * FLUSH_SYNC_POINT + * | + * v + * + * + * @endverbatim + */ + + ImageCtxT *m_local_image_ctx; + ImageCtxT *m_remote_image_ctx; + SafeTimer *m_timer; + Mutex *m_timer_lock; + Journaler *m_journaler; + MirrorPeerClientMeta *m_client_meta; + MirrorPeerSyncPoint *m_sync_point; + ProgressContext *m_progress_ctx; + + SnapMap m_snap_map; + + Mutex m_lock; + bool m_canceled = false; + + uint64_t m_object_no = 0; + uint64_t m_end_object_no; + uint64_t m_current_ops = 0; + int m_ret_val = 0; + + bool m_updating_sync_point; + Context *m_update_sync_ctx; + double m_update_sync_point_interval; + + MirrorPeerClientMeta m_client_meta_copy; + + void send_update_max_object_count(); + void handle_update_max_object_count(int r); + + void send_object_copies(); + void send_next_object_copy(); + void handle_object_copy(int r); + + void send_update_sync_point(); + void handle_update_sync_point(int r); + + void send_flush_sync_point(); + void handle_flush_sync_point(int r); + + int compute_snap_map(); + + void update_progress(const std::string &description, bool flush = true); +}; + +} // namespace image_sync +} // namespace mirror +} // namespace rbd + +extern template class rbd::mirror::image_sync::ImageCopyRequest; + +#endif // RBD_MIRROR_IMAGE_SYNC_IMAGE_COPY_REQUEST_H