From: Jason Dillaman Date: Sat, 22 Feb 2020 17:42:28 +0000 (-0500) Subject: rbd-mirror: check for resync request during snapshot prepare state machine X-Git-Tag: v15.1.1~224^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=691dcdd2b992420874eebf803eda8afc4e5ef028;p=ceph.git rbd-mirror: check for resync request during snapshot prepare state machine Before attempting to start the image replayer for snapshot-based mirroring, check to ensure that a resync hasn't already been requested. Signed-off-by: Jason Dillaman --- diff --git a/src/tools/rbd_mirror/image_replayer/snapshot/PrepareReplayRequest.cc b/src/tools/rbd_mirror/image_replayer/snapshot/PrepareReplayRequest.cc index 38340de22843..575eb8534fa3 100644 --- a/src/tools/rbd_mirror/image_replayer/snapshot/PrepareReplayRequest.cc +++ b/src/tools/rbd_mirror/image_replayer/snapshot/PrepareReplayRequest.cc @@ -7,6 +7,7 @@ #include "common/errno.h" #include "librbd/ImageCtx.h" #include "librbd/Utils.h" +#include "librbd/mirror/snapshot/ImageMeta.h" #include "tools/rbd_mirror/ProgressContext.h" #include "tools/rbd_mirror/image_replayer/snapshot/StateBuilder.h" @@ -22,12 +23,42 @@ namespace mirror { namespace image_replayer { namespace snapshot { +using librbd::util::create_context_callback; + template void PrepareReplayRequest::send() { - // TODO *m_resync_requested = false; *m_syncing = false; + load_local_image_meta(); +} + +template +void PrepareReplayRequest::load_local_image_meta() { + dout(15) << dendl; + + ceph_assert(m_state_builder->local_image_meta == nullptr); + m_state_builder->local_image_meta = + librbd::mirror::snapshot::ImageMeta::create( + m_state_builder->local_image_ctx, m_local_mirror_uuid); + + auto ctx = create_context_callback< + PrepareReplayRequest, + &PrepareReplayRequest::handle_load_local_image_meta>(this); + m_state_builder->local_image_meta->load(ctx); +} + +template +void PrepareReplayRequest::handle_load_local_image_meta(int r) { + dout(15) << "r=" << r << dendl; + + if (r < 0 && r != -ENOENT) { + derr << "failed to load local image-meta: " << cpp_strerror(r) << dendl; + finish(r); + return; + } + + *m_resync_requested = m_state_builder->local_image_meta->resync_requested; finish(0); } diff --git a/src/tools/rbd_mirror/image_replayer/snapshot/PrepareReplayRequest.h b/src/tools/rbd_mirror/image_replayer/snapshot/PrepareReplayRequest.h index 4cd1f9b0d358..315080238f7d 100644 --- a/src/tools/rbd_mirror/image_replayer/snapshot/PrepareReplayRequest.h +++ b/src/tools/rbd_mirror/image_replayer/snapshot/PrepareReplayRequest.h @@ -66,6 +66,9 @@ private: * * | * v + * LOAD_LOCAL_IMAGE_META + * | + * v * * * @endverbatim @@ -77,6 +80,10 @@ private: StateBuilder* m_state_builder; bool* m_resync_requested; bool* m_syncing; + + void load_local_image_meta(); + void handle_load_local_image_meta(int r); + }; } // namespace snapshot diff --git a/src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.cc b/src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.cc index 0b573439118f..27225707f553 100644 --- a/src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.cc +++ b/src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.cc @@ -7,6 +7,7 @@ #include "common/debug.h" #include "common/errno.h" #include "librbd/ImageCtx.h" +#include "librbd/mirror/snapshot/ImageMeta.h" #include "tools/rbd_mirror/image_replayer/snapshot/CreateLocalImageRequest.h" #include "tools/rbd_mirror/image_replayer/snapshot/PrepareReplayRequest.h" #include "tools/rbd_mirror/image_replayer/snapshot/Replayer.h" @@ -30,12 +31,16 @@ StateBuilder::StateBuilder(const std::string& global_image_id) template StateBuilder::~StateBuilder() { + ceph_assert(local_image_meta == nullptr); } template void StateBuilder::close(Context* on_finish) { dout(10) << dendl; + delete local_image_meta; + local_image_meta = nullptr; + // close the remote image after closing the local // image in case the remote cluster is unreachable and // we cannot close it. diff --git a/src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.h b/src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.h index 7222f864ab41..83c55ebafdcc 100644 --- a/src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.h +++ b/src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.h @@ -9,7 +9,18 @@ struct Context; -namespace librbd { struct ImageCtx; } +namespace librbd { + +struct ImageCtx; + +namespace mirror { +namespace snapshot { + +template class ImageMeta; + +} // namespace snapshot +} // namespace mirror +} // namespace librbd namespace rbd { namespace mirror { @@ -66,6 +77,7 @@ public: std::string remote_mirror_peer_uuid; + librbd::mirror::snapshot::ImageMeta* local_image_meta = nullptr; }; } // namespace snapshot