From: Prasanna Kumar Kalever Date: Fri, 28 Mar 2025 16:24:44 +0000 (+0530) Subject: rbd-mirror: implement group replayer Health State X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=3ad63e5c0cc9e05d588cdb099955e2205d6d7f81;p=ceph-ci.git rbd-mirror: implement group replayer Health State Signed-off-by: Prasanna Kumar Kalever --- diff --git a/src/tools/rbd_mirror/GroupReplayer.cc b/src/tools/rbd_mirror/GroupReplayer.cc index 8d597cf1a0d..fddc59fd8aa 100644 --- a/src/tools/rbd_mirror/GroupReplayer.cc +++ b/src/tools/rbd_mirror/GroupReplayer.cc @@ -292,9 +292,16 @@ void GroupReplayer::sync_group_names() { } template -image_replayer::HealthState GroupReplayer::get_health_state() const { - // TODO: Implement something like m_mirror_image_status_state for group - return image_replayer::HEALTH_STATE_OK; +group_replayer::HealthState GroupReplayer::get_health_state() const { + std::lock_guard locker{m_lock}; + + if (!m_status_state) { + return group_replayer::HEALTH_STATE_OK; + } else if (*m_status_state == + cls::rbd::MIRROR_GROUP_STATUS_STATE_UNKNOWN) { + return group_replayer::HEALTH_STATE_WARNING; + } + return group_replayer::HEALTH_STATE_ERROR; } template @@ -868,7 +875,7 @@ void GroupReplayer::shut_down(int r) { // chain the shut down sequence (reverse order) Context *ctx = new LambdaContext( [this, r](int _r) { - set_mirror_group_status_update(m_status_state, m_state_desc); + set_mirror_group_status_update(*m_status_state, m_state_desc); handle_shut_down(r); }); @@ -1123,6 +1130,8 @@ void GroupReplayer::set_mirror_group_status_update( m_remote_group_peer.mirror_status_updater->set_mirror_group_status( m_global_group_id, remote_status, true); } + m_status_state = local_status.state; + m_state_desc = local_status.description; } } // namespace mirror diff --git a/src/tools/rbd_mirror/GroupReplayer.h b/src/tools/rbd_mirror/GroupReplayer.h index 7c2d9e15089..a5341d21654 100644 --- a/src/tools/rbd_mirror/GroupReplayer.h +++ b/src/tools/rbd_mirror/GroupReplayer.h @@ -10,7 +10,7 @@ #include "include/rados/librados.hpp" #include "tools/rbd_mirror/Types.h" #include "tools/rbd_mirror/group_replayer/Replayer.h" -#include "tools/rbd_mirror/image_replayer/Types.h" +#include "tools/rbd_mirror/group_replayer/Types.h" #include #include #include @@ -100,7 +100,7 @@ public: void sync_group_names(); - image_replayer::HealthState get_health_state() const; + group_replayer::HealthState get_health_state() const; void add_peer(const Peer& peer); @@ -178,6 +178,9 @@ private: } }; + typedef boost::optional + OptionalMirrorGroupStatusState; + librados::IoCtx &m_local_io_ctx; std::string m_local_mirror_uuid; std::string m_global_group_id; @@ -200,7 +203,8 @@ private: mutable ceph::mutex m_lock; State m_state = STATE_STOPPED; std::string m_state_desc; - cls::rbd::MirrorGroupStatusState m_status_state; + OptionalMirrorGroupStatusState m_status_state = + boost::make_optional(false, cls::rbd::MIRROR_GROUP_STATUS_STATE_UNKNOWN); int m_last_r = 0; Context *m_on_start_finish = nullptr; diff --git a/src/tools/rbd_mirror/InstanceReplayer.cc b/src/tools/rbd_mirror/InstanceReplayer.cc index 9c573c6deba..252fa801e47 100644 --- a/src/tools/rbd_mirror/InstanceReplayer.cc +++ b/src/tools/rbd_mirror/InstanceReplayer.cc @@ -709,9 +709,9 @@ void InstanceReplayer::start_group_replayers(int r) { ++group_count; auto health_state = current_it->second->get_health_state(); - if (health_state == image_replayer::HEALTH_STATE_WARNING) { + if (health_state == group_replayer::HEALTH_STATE_WARNING) { ++warning_count; - } else if (health_state == image_replayer::HEALTH_STATE_ERROR) { + } else if (health_state == group_replayer::HEALTH_STATE_ERROR) { ++error_count; } diff --git a/src/tools/rbd_mirror/group_replayer/Replayer.h b/src/tools/rbd_mirror/group_replayer/Replayer.h index 7da1fd3b388..1779fa47567 100644 --- a/src/tools/rbd_mirror/group_replayer/Replayer.h +++ b/src/tools/rbd_mirror/group_replayer/Replayer.h @@ -10,8 +10,7 @@ #include "include/rados/librados.hpp" #include "librbd/mirror/snapshot/Types.h" #include "tools/rbd_mirror/Types.h" -#include "tools/rbd_mirror/image_replayer/Replayer.h" -#include "tools/rbd_mirror/image_replayer/Types.h" +#include "tools/rbd_mirror/group_replayer/Types.h" #include class Context; diff --git a/src/tools/rbd_mirror/group_replayer/Types.h b/src/tools/rbd_mirror/group_replayer/Types.h new file mode 100644 index 00000000000..91f97d6bac2 --- /dev/null +++ b/src/tools/rbd_mirror/group_replayer/Types.h @@ -0,0 +1,21 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#ifndef CEPH_RBD_MIRROR_GROUP_REPLAYER_TYPES_H +#define CEPH_RBD_MIRROR_GROUP_REPLAYER_TYPES_H + +namespace rbd { +namespace mirror { +namespace group_replayer { + +enum HealthState { + HEALTH_STATE_OK, + HEALTH_STATE_WARNING, + HEALTH_STATE_ERROR +}; + +} // namespace group_replayer +} // namespace mirror +} // namespace rbd + +#endif // CEPH_RBD_MIRROR_GROUP_REPLAYER_TYPES_H