]>
git.proxmox.com Git - ceph.git/blob - ceph/src/test/rbd_mirror/test_Instances.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "include/rados/librados.hpp"
5 #include "cls/rbd/cls_rbd_client.h"
6 #include "test/rbd_mirror/test_fixture.h"
7 #include "tools/rbd_mirror/InstanceWatcher.h"
8 #include "tools/rbd_mirror/Instances.h"
9 #include "tools/rbd_mirror/Threads.h"
10 #include "common/Cond.h"
12 #include "test/librados/test.h"
13 #include "gtest/gtest.h"
16 using rbd::mirror::InstanceWatcher
;
17 using rbd::mirror::Instances
;
19 void register_test_instances() {
22 class TestInstances
: public ::rbd::mirror::TestFixture
{
24 struct Listener
: public rbd::mirror::instances::Listener
{
29 std::set
<std::string
> ids
;
36 void handle(const InstanceIds
& instance_ids
, Instance
* instance
) {
37 std::unique_lock
<std::mutex
> locker(lock
);
38 for (auto& instance_id
: instance_ids
) {
39 ceph_assert(instance
->count
> 0);
42 instance
->ids
.insert(instance_id
);
43 if (instance
->count
== 0) {
44 instance
->ctx
.complete(0);
49 void handle_added(const InstanceIds
& instance_ids
) override
{
50 handle(instance_ids
, &add
);
53 void handle_removed(const InstanceIds
& instance_ids
) override
{
54 handle(instance_ids
, &remove
);
58 virtual void SetUp() {
60 m_local_io_ctx
.remove(RBD_MIRROR_LEADER
);
61 EXPECT_EQ(0, m_local_io_ctx
.create(RBD_MIRROR_LEADER
, true));
63 m_instance_id
= stringify(m_local_io_ctx
.get_instance_id());
67 std::string m_instance_id
;
70 TEST_F(TestInstances
, InitShutdown
)
72 m_listener
.add
.count
= 1;
73 Instances
<> instances(m_threads
, m_local_io_ctx
, m_instance_id
, m_listener
);
75 std::string instance_id
= "instance_id";
76 ASSERT_EQ(0, librbd::cls_client::mirror_instances_add(&m_local_io_ctx
,
80 instances
.init(&on_init
);
81 ASSERT_EQ(0, on_init
.wait());
83 ASSERT_LT(0U, m_listener
.add
.count
);
84 instances
.unblock_listener();
86 ASSERT_EQ(0, m_listener
.add
.ctx
.wait());
87 ASSERT_EQ(std::set
<std::string
>({instance_id
}), m_listener
.add
.ids
);
89 C_SaferCond on_shut_down
;
90 instances
.shut_down(&on_shut_down
);
91 ASSERT_EQ(0, on_shut_down
.wait());
94 TEST_F(TestInstances
, InitEnoent
)
96 Instances
<> instances(m_threads
, m_local_io_ctx
, m_instance_id
, m_listener
);
98 m_local_io_ctx
.remove(RBD_MIRROR_LEADER
);
101 instances
.init(&on_init
);
102 ASSERT_EQ(0, on_init
.wait());
104 C_SaferCond on_shut_down
;
105 instances
.shut_down(&on_shut_down
);
106 ASSERT_EQ(0, on_shut_down
.wait());
109 TEST_F(TestInstances
, NotifyRemove
)
111 // speed testing up a little
112 EXPECT_EQ(0, _rados
->conf_set("rbd_mirror_leader_heartbeat_interval", "1"));
113 EXPECT_EQ(0, _rados
->conf_set("rbd_mirror_leader_max_missed_heartbeats",
115 EXPECT_EQ(0, _rados
->conf_set("rbd_mirror_leader_max_acquire_attempts_before_break",
118 m_listener
.add
.count
= 2;
119 m_listener
.remove
.count
= 1;
120 Instances
<> instances(m_threads
, m_local_io_ctx
, m_instance_id
, m_listener
);
122 std::string instance_id1
= "instance_id1";
123 std::string instance_id2
= "instance_id2";
125 ASSERT_EQ(0, librbd::cls_client::mirror_instances_add(&m_local_io_ctx
,
129 instances
.init(&on_init
);
130 ASSERT_EQ(0, on_init
.wait());
132 instances
.acked({instance_id2
});
134 ASSERT_LT(0U, m_listener
.add
.count
);
135 instances
.unblock_listener();
137 ASSERT_EQ(0, m_listener
.add
.ctx
.wait());
138 ASSERT_EQ(std::set
<std::string
>({instance_id1
, instance_id2
}),
141 std::vector
<std::string
> instance_ids
;
142 for (int i
= 0; i
< 100; i
++) {
143 instances
.acked({instance_id1
});
144 if (m_listener
.remove
.count
> 0) {
149 instances
.acked({instance_id1
});
150 ASSERT_EQ(0, m_listener
.remove
.ctx
.wait());
151 ASSERT_EQ(std::set
<std::string
>({instance_id2
}),
152 m_listener
.remove
.ids
);
155 instances
.acked({instance_id1
});
156 InstanceWatcher
<>::get_instances(m_local_io_ctx
, &instance_ids
, &on_get
);
157 EXPECT_EQ(0, on_get
.wait());
158 EXPECT_EQ(1U, instance_ids
.size());
159 ASSERT_EQ(instance_ids
[0], instance_id1
);
161 C_SaferCond on_shut_down
;
162 instances
.shut_down(&on_shut_down
);
163 ASSERT_EQ(0, on_shut_down
.wait());