From f49fa483ec6cdc19b4d60debefbb21bf65b7a385 Mon Sep 17 00:00:00 2001 From: Ilya Dryomov Date: Fri, 21 Jan 2022 13:41:46 +0100 Subject: [PATCH] rbd-mirror: untangle StateBuilder::is_linked() overloads Make it clear that the local image non-primariness is asserted independent of the mode; avoid the default implementation being overridden but still relied on by both modes. Signed-off-by: Ilya Dryomov --- src/tools/rbd_mirror/image_replayer/StateBuilder.cc | 5 +++-- src/tools/rbd_mirror/image_replayer/StateBuilder.h | 4 +++- src/tools/rbd_mirror/image_replayer/journal/StateBuilder.cc | 5 ++--- src/tools/rbd_mirror/image_replayer/journal/StateBuilder.h | 2 +- src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.cc | 5 ++--- src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.h | 4 +++- 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/tools/rbd_mirror/image_replayer/StateBuilder.cc b/src/tools/rbd_mirror/image_replayer/StateBuilder.cc index 3cd03e51e5cab..3c7274ec56e56 100644 --- a/src/tools/rbd_mirror/image_replayer/StateBuilder.cc +++ b/src/tools/rbd_mirror/image_replayer/StateBuilder.cc @@ -43,8 +43,9 @@ bool StateBuilder::is_local_primary() const { template bool StateBuilder::is_linked() const { - return (local_promotion_state == - librbd::mirror::PROMOTION_STATE_NON_PRIMARY); + return ((local_promotion_state == + librbd::mirror::PROMOTION_STATE_NON_PRIMARY) && + is_linked_impl()); } template diff --git a/src/tools/rbd_mirror/image_replayer/StateBuilder.h b/src/tools/rbd_mirror/image_replayer/StateBuilder.h index d055c84e02068..844c3133bd169 100644 --- a/src/tools/rbd_mirror/image_replayer/StateBuilder.h +++ b/src/tools/rbd_mirror/image_replayer/StateBuilder.h @@ -44,7 +44,7 @@ public: virtual bool is_disconnected() const = 0; bool is_local_primary() const; - virtual bool is_linked() const; + bool is_linked() const; virtual cls::rbd::MirrorImageMode get_mirror_image_mode() const = 0; @@ -100,6 +100,8 @@ protected: void close_local_image(Context* on_finish); private: + virtual bool is_linked_impl() const = 0; + void handle_close_local_image(int r, Context* on_finish); void handle_close_remote_image(int r, Context* on_finish); }; diff --git a/src/tools/rbd_mirror/image_replayer/journal/StateBuilder.cc b/src/tools/rbd_mirror/image_replayer/journal/StateBuilder.cc index 8d391580ed7c0..2c95211d41e12 100644 --- a/src/tools/rbd_mirror/image_replayer/journal/StateBuilder.cc +++ b/src/tools/rbd_mirror/image_replayer/journal/StateBuilder.cc @@ -58,10 +58,9 @@ bool StateBuilder::is_disconnected() const { } template -bool StateBuilder::is_linked() const { +bool StateBuilder::is_linked_impl() const { ceph_assert(!this->remote_mirror_uuid.empty()); - return (image_replayer::StateBuilder::is_linked() && - local_primary_mirror_uuid == this->remote_mirror_uuid); + return (local_primary_mirror_uuid == this->remote_mirror_uuid); } template diff --git a/src/tools/rbd_mirror/image_replayer/journal/StateBuilder.h b/src/tools/rbd_mirror/image_replayer/journal/StateBuilder.h index 1d4fa83cbb041..054c24674f084 100644 --- a/src/tools/rbd_mirror/image_replayer/journal/StateBuilder.h +++ b/src/tools/rbd_mirror/image_replayer/journal/StateBuilder.h @@ -37,7 +37,6 @@ public: void close(Context* on_finish) override; bool is_disconnected() const override; - bool is_linked() const override; cls::rbd::MirrorImageMode get_mirror_image_mode() const override; @@ -75,6 +74,7 @@ public: SyncPointHandler* sync_point_handler = nullptr; private: + bool is_linked_impl() const override; void shut_down_remote_journaler(Context* on_finish); void handle_shut_down_remote_journaler(int r, Context* on_finish); diff --git a/src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.cc b/src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.cc index 2fb2534d64206..52e64e762f5f1 100644 --- a/src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.cc +++ b/src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.cc @@ -56,10 +56,9 @@ bool StateBuilder::is_disconnected() const { } template -bool StateBuilder::is_linked() const { +bool StateBuilder::is_linked_impl() const { // the remote has to have us registered as a peer - return (image_replayer::StateBuilder::is_linked() && - !remote_mirror_peer_uuid.empty()); + return !remote_mirror_peer_uuid.empty(); } template diff --git a/src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.h b/src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.h index ab326255fdb86..a4ab82982c103 100644 --- a/src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.h +++ b/src/tools/rbd_mirror/image_replayer/snapshot/StateBuilder.h @@ -42,7 +42,6 @@ public: void close(Context* on_finish) override; bool is_disconnected() const override; - bool is_linked() const override; cls::rbd::MirrorImageMode get_mirror_image_mode() const override; @@ -79,6 +78,9 @@ public: std::string remote_mirror_peer_uuid; librbd::mirror::snapshot::ImageMeta* local_image_meta = nullptr; + +private: + bool is_linked_impl() const override; }; } // namespace snapshot -- 2.39.5