]> git.proxmox.com Git - ceph.git/blob - ceph/src/test/rbd_mirror/test_Instances.cc
add subtree-ish sources for 12.0.3
[ceph.git] / 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
3
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
11 #include "test/librados/test.h"
12 #include "gtest/gtest.h"
13
14 using rbd::mirror::InstanceWatcher;
15 using rbd::mirror::Instances;
16
17 void register_test_instances() {
18 }
19
20 class TestInstances : public ::rbd::mirror::TestFixture {
21 public:
22 virtual void SetUp() {
23 TestFixture::SetUp();
24 m_local_io_ctx.remove(RBD_MIRROR_LEADER);
25 EXPECT_EQ(0, m_local_io_ctx.create(RBD_MIRROR_LEADER, true));
26 }
27 };
28
29 TEST_F(TestInstances, InitShutdown)
30 {
31 Instances<> instances(m_threads, m_local_io_ctx);
32
33 std::string instance_id = "instance_id";
34 ASSERT_EQ(0, librbd::cls_client::mirror_instances_add(&m_local_io_ctx,
35 instance_id));
36
37 C_SaferCond on_init;
38 instances.init(&on_init);
39 ASSERT_EQ(0, on_init.wait());
40
41 C_SaferCond on_shut_down;
42 instances.shut_down(&on_shut_down);
43 ASSERT_EQ(0, on_shut_down.wait());
44 }
45
46 TEST_F(TestInstances, InitEnoent)
47 {
48 Instances<> instances(m_threads, m_local_io_ctx);
49
50 m_local_io_ctx.remove(RBD_MIRROR_LEADER);
51
52 C_SaferCond on_init;
53 instances.init(&on_init);
54 ASSERT_EQ(0, on_init.wait());
55
56 C_SaferCond on_shut_down;
57 instances.shut_down(&on_shut_down);
58 ASSERT_EQ(0, on_shut_down.wait());
59 }
60
61 TEST_F(TestInstances, NotifyRemove)
62 {
63 // speed testing up a little
64 EXPECT_EQ(0, _rados->conf_set("rbd_mirror_leader_heartbeat_interval", "1"));
65 EXPECT_EQ(0, _rados->conf_set("rbd_mirror_leader_max_missed_heartbeats",
66 "2"));
67
68 Instances<> instances(m_threads, m_local_io_ctx);
69
70 std::string instance_id1 = "instance_id1";
71 std::string instance_id2 = "instance_id2";
72
73 ASSERT_EQ(0, librbd::cls_client::mirror_instances_add(&m_local_io_ctx,
74 instance_id1));
75 ASSERT_EQ(0, librbd::cls_client::mirror_instances_add(&m_local_io_ctx,
76 instance_id2));
77
78 C_SaferCond on_init;
79 instances.init(&on_init);
80 ASSERT_EQ(0, on_init.wait());
81
82 std::vector<std::string> instance_ids;
83
84 for (int i = 0; i < 10; i++) {
85 instances.notify(instance_id1);
86 sleep(1);
87 C_SaferCond on_get;
88 InstanceWatcher<>::get_instances(m_local_io_ctx, &instance_ids, &on_get);
89 EXPECT_EQ(0, on_get.wait());
90 if (instance_ids.size() <= 1U) {
91 break;
92 }
93 }
94
95 ASSERT_EQ(1U, instance_ids.size());
96 ASSERT_EQ(instance_ids[0], instance_id1);
97
98 C_SaferCond on_shut_down;
99 instances.shut_down(&on_shut_down);
100 ASSERT_EQ(0, on_shut_down.wait());
101 }