// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab #include "include/rados/librados.hpp" #include "cls/rbd/cls_rbd_client.h" #include "test/rbd_mirror/test_fixture.h" #include "tools/rbd_mirror/InstanceWatcher.h" #include "tools/rbd_mirror/Instances.h" #include "tools/rbd_mirror/Threads.h" #include "test/librados/test.h" #include "gtest/gtest.h" using rbd::mirror::InstanceWatcher; using rbd::mirror::Instances; void register_test_instances() { } class TestInstances : public ::rbd::mirror::TestFixture { public: virtual void SetUp() { TestFixture::SetUp(); m_local_io_ctx.remove(RBD_MIRROR_LEADER); EXPECT_EQ(0, m_local_io_ctx.create(RBD_MIRROR_LEADER, true)); } }; TEST_F(TestInstances, InitShutdown) { Instances<> instances(m_threads, m_local_io_ctx); std::string instance_id = "instance_id"; ASSERT_EQ(0, librbd::cls_client::mirror_instances_add(&m_local_io_ctx, instance_id)); C_SaferCond on_init; instances.init(&on_init); ASSERT_EQ(0, on_init.wait()); C_SaferCond on_shut_down; instances.shut_down(&on_shut_down); ASSERT_EQ(0, on_shut_down.wait()); } TEST_F(TestInstances, InitEnoent) { Instances<> instances(m_threads, m_local_io_ctx); m_local_io_ctx.remove(RBD_MIRROR_LEADER); C_SaferCond on_init; instances.init(&on_init); ASSERT_EQ(0, on_init.wait()); C_SaferCond on_shut_down; instances.shut_down(&on_shut_down); ASSERT_EQ(0, on_shut_down.wait()); } TEST_F(TestInstances, NotifyRemove) { // speed testing up a little EXPECT_EQ(0, _rados->conf_set("rbd_mirror_leader_heartbeat_interval", "1")); EXPECT_EQ(0, _rados->conf_set("rbd_mirror_leader_max_missed_heartbeats", "2")); Instances<> instances(m_threads, m_local_io_ctx); std::string instance_id1 = "instance_id1"; std::string instance_id2 = "instance_id2"; ASSERT_EQ(0, librbd::cls_client::mirror_instances_add(&m_local_io_ctx, instance_id1)); ASSERT_EQ(0, librbd::cls_client::mirror_instances_add(&m_local_io_ctx, instance_id2)); C_SaferCond on_init; instances.init(&on_init); ASSERT_EQ(0, on_init.wait()); std::vector instance_ids; for (int i = 0; i < 10; i++) { instances.notify(instance_id1); sleep(1); C_SaferCond on_get; InstanceWatcher<>::get_instances(m_local_io_ctx, &instance_ids, &on_get); EXPECT_EQ(0, on_get.wait()); if (instance_ids.size() <= 1U) { break; } } ASSERT_EQ(1U, instance_ids.size()); ASSERT_EQ(instance_ids[0], instance_id1); C_SaferCond on_shut_down; instances.shut_down(&on_shut_down); ASSERT_EQ(0, on_shut_down.wait()); }