template<>
struct StateBuilder<librbd::MockTestImageCtx> {
virtual ~StateBuilder() {}
+
+ std::string local_image_id;
+ librbd::mirror::PromotionState local_promotion_state;
+ std::string local_primary_mirror_uuid;
};
GetMirrorImageIdRequest<librbd::MockTestImageCtx>* GetMirrorImageIdRequest<librbd::MockTestImageCtx>::s_instance = nullptr;
: public image_replayer::StateBuilder<librbd::MockTestImageCtx> {
static StateBuilder* s_instance;
- std::string local_image_id;
- std::string local_tag_owner;
-
static StateBuilder* create(const std::string&) {
ceph_assert(s_instance != nullptr);
return s_instance;
ASSERT_EQ(std::string("local image name"), local_image_name);
ASSERT_EQ(std::string("local image id"),
mock_journal_state_builder.local_image_id);
+ ASSERT_EQ(librbd::mirror::PROMOTION_STATE_NON_PRIMARY,
+ mock_journal_state_builder.local_promotion_state);
ASSERT_EQ(std::string("remote mirror uuid"),
- mock_journal_state_builder.local_tag_owner);
+ mock_journal_state_builder.local_primary_mirror_uuid);
}
TEST_F(TestMockImageReplayerPrepareLocalImageRequest, MirrorImageIdError) {
switch (m_mirror_image.mode) {
case cls::rbd::MIRROR_IMAGE_MODE_JOURNAL:
- {
- // journal-based local image exists
- auto state_builder = journal::StateBuilder<I>::create(m_global_image_id);
- state_builder->local_image_id = m_local_image_id;
- // TODO store promotion state + primary
- switch (m_promotion_state) {
- case librbd::mirror::PROMOTION_STATE_PRIMARY:
- state_builder->local_tag_owner = librbd::Journal<>::LOCAL_MIRROR_UUID;
- break;
- case librbd::mirror::PROMOTION_STATE_NON_PRIMARY:
- state_builder->local_tag_owner = m_primary_mirror_uuid;
- break;
- case librbd::mirror::PROMOTION_STATE_ORPHAN:
- state_builder->local_tag_owner = librbd::Journal<>::ORPHAN_MIRROR_UUID;
- break;
- }
- *m_state_builder = state_builder;
- }
+ // journal-based local image exists
+ *m_state_builder = journal::StateBuilder<I>::create(m_global_image_id);
break;
case cls::rbd::MIRROR_IMAGE_MODE_SNAPSHOT:
// TODO
break;
}
+ (*m_state_builder)->local_image_id = m_local_image_id;
+ (*m_state_builder)->local_promotion_state = m_promotion_state;
+ (*m_state_builder)->local_primary_mirror_uuid = m_primary_mirror_uuid;
finish(0);
}
ceph_assert(m_sync_point_handler == nullptr);
}
+template <typename I>
+bool StateBuilder<I>::is_local_primary() const {
+ return (!local_image_id.empty() &&
+ local_promotion_state == librbd::mirror::PROMOTION_STATE_PRIMARY);
+}
+
+template <typename I>
+bool StateBuilder<I>::is_linked() const {
+ return (local_promotion_state ==
+ librbd::mirror::PROMOTION_STATE_NON_PRIMARY &&
+ local_primary_mirror_uuid == remote_mirror_uuid);
+}
+
template <typename I>
void StateBuilder<I>::close_local_image(Context* on_finish) {
if (local_image_ctx == nullptr) {
virtual bool is_disconnected() const = 0;
- virtual bool is_local_primary() const = 0;
- virtual bool is_linked() const = 0;
+ bool is_local_primary() const;
+ virtual bool is_linked() const;
virtual cls::rbd::MirrorImageMode get_mirror_image_mode() const = 0;
std::string global_image_id;
std::string local_image_id;
+ librbd::mirror::PromotionState local_promotion_state =
+ librbd::mirror::PROMOTION_STATE_PRIMARY;
+ std::string local_primary_mirror_uuid;
ImageCtxT* local_image_ctx = nullptr;
std::string remote_mirror_uuid;
return (remote_client_state == cls::journal::CLIENT_STATE_DISCONNECTED);
}
-template <typename I>
-bool StateBuilder<I>::is_local_primary() const {
- return (!this->local_image_id.empty() &&
- local_tag_owner == librbd::Journal<>::LOCAL_MIRROR_UUID);
-}
-
-template <typename I>
-bool StateBuilder<I>::is_linked() const {
- return (local_tag_owner == this->remote_mirror_uuid);
-}
-
template <typename I>
cls::rbd::MirrorImageMode StateBuilder<I>::get_mirror_image_mode() const {
return cls::rbd::MIRROR_IMAGE_MODE_JOURNAL;
bool is_disconnected() const override;
- bool is_local_primary() const override;
- bool is_linked() const override;
-
cls::rbd::MirrorImageMode get_mirror_image_mode() const override;
image_sync::SyncPointHandler* create_sync_point_handler() override;
const std::string& local_mirror_uuid,
ReplayerListener* replayer_listener) override;
- std::string local_tag_owner;
-
Journaler* remote_journaler = nullptr;
cls::journal::ClientState remote_client_state =
cls::journal::CLIENT_STATE_CONNECTED;