X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fceph%2Fsrc%2Ftest%2Fjournal%2Ftest_JournalMetadata.cc;fp=src%2Fceph%2Fsrc%2Ftest%2Fjournal%2Ftest_JournalMetadata.cc;h=0000000000000000000000000000000000000000;hb=7da45d65be36d36b880cc55c5036e96c24b53f00;hp=bdb3107f982a11a918d83752f328bee1cfbdb3b6;hpb=691462d09d0987b47e112d6ee8740375df3c51b2;p=stor4nfv.git diff --git a/src/ceph/src/test/journal/test_JournalMetadata.cc b/src/ceph/src/test/journal/test_JournalMetadata.cc deleted file mode 100644 index bdb3107..0000000 --- a/src/ceph/src/test/journal/test_JournalMetadata.cc +++ /dev/null @@ -1,213 +0,0 @@ -// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- -// vim: ts=8 sw=2 smarttab - -#include "journal/JournalMetadata.h" -#include "test/journal/RadosTestFixture.h" -#include "common/Cond.h" -#include "common/Mutex.h" -#include - -class TestJournalMetadata : public RadosTestFixture { -public: - void TearDown() override { - for (MetadataList::iterator it = m_metadata_list.begin(); - it != m_metadata_list.end(); ++it) { - (*it)->remove_listener(&m_listener); - } - m_metadata_list.clear(); - - RadosTestFixture::TearDown(); - } - - journal::JournalMetadataPtr create_metadata(const std::string &oid, - const std::string &client_id, - double commit_interval = 0.1, - uint64_t max_fetch_bytes = 0, - int max_concurrent_object_sets = 0) { - journal::JournalMetadataPtr metadata = RadosTestFixture::create_metadata( - oid, client_id, commit_interval, max_fetch_bytes, - max_concurrent_object_sets); - m_metadata_list.push_back(metadata); - metadata->add_listener(&m_listener); - return metadata; - } - - typedef std::list MetadataList; - MetadataList m_metadata_list; -}; - -TEST_F(TestJournalMetadata, JournalDNE) { - std::string oid = get_temp_oid(); - - journal::JournalMetadataPtr metadata1 = create_metadata(oid, "client1"); - ASSERT_EQ(-ENOENT, init_metadata(metadata1)); -} - -TEST_F(TestJournalMetadata, ClientDNE) { - std::string oid = get_temp_oid(); - - ASSERT_EQ(0, create(oid, 14, 2)); - ASSERT_EQ(0, client_register(oid, "client1", "")); - - journal::JournalMetadataPtr metadata1 = create_metadata(oid, "client1"); - ASSERT_EQ(0, init_metadata(metadata1)); - - journal::JournalMetadataPtr metadata2 = create_metadata(oid, "client2"); - ASSERT_EQ(-ENOENT, init_metadata(metadata2)); -} - -TEST_F(TestJournalMetadata, Committed) { - std::string oid = get_temp_oid(); - - ASSERT_EQ(0, create(oid, 14, 2)); - ASSERT_EQ(0, client_register(oid, "client1", "")); - - journal::JournalMetadataPtr metadata1 = create_metadata(oid, "client1", 600); - ASSERT_EQ(0, init_metadata(metadata1)); - - journal::JournalMetadataPtr metadata2 = create_metadata(oid, "client1"); - ASSERT_EQ(0, init_metadata(metadata2)); - ASSERT_TRUE(wait_for_update(metadata2)); - - journal::JournalMetadata::ObjectSetPosition expect_commit_position; - journal::JournalMetadata::ObjectSetPosition read_commit_position; - metadata1->get_commit_position(&read_commit_position); - ASSERT_EQ(expect_commit_position, read_commit_position); - - uint64_t commit_tid1 = metadata1->allocate_commit_tid(0, 0, 0); - uint64_t commit_tid2 = metadata1->allocate_commit_tid(0, 1, 0); - uint64_t commit_tid3 = metadata1->allocate_commit_tid(1, 0, 1); - uint64_t commit_tid4 = metadata1->allocate_commit_tid(0, 0, 2); - - // cannot commit until tid1 + 2 committed - metadata1->committed(commit_tid2, []() { return nullptr; }); - metadata1->committed(commit_tid3, []() { return nullptr; }); - - C_SaferCond cond1; - metadata1->committed(commit_tid1, [&cond1]() { return &cond1; }); - - // given our 10 minute commit internal, this should override the - // in-flight commit - C_SaferCond cond2; - metadata1->committed(commit_tid4, [&cond2]() { return &cond2; }); - - ASSERT_EQ(-ESTALE, cond1.wait()); - metadata1->flush_commit_position(); - ASSERT_EQ(0, cond2.wait()); - - ASSERT_TRUE(wait_for_update(metadata2)); - metadata2->get_commit_position(&read_commit_position); - expect_commit_position = {{{0, 0, 2}, {1, 0, 1}}}; - ASSERT_EQ(expect_commit_position, read_commit_position); -} - -TEST_F(TestJournalMetadata, UpdateActiveObject) { - std::string oid = get_temp_oid(); - - ASSERT_EQ(0, create(oid, 14, 2)); - ASSERT_EQ(0, client_register(oid, "client1", "")); - - journal::JournalMetadataPtr metadata1 = create_metadata(oid, "client1"); - ASSERT_EQ(0, init_metadata(metadata1)); - ASSERT_TRUE(wait_for_update(metadata1)); - - ASSERT_EQ(0U, metadata1->get_active_set()); - - ASSERT_EQ(0, metadata1->set_active_set(123)); - ASSERT_TRUE(wait_for_update(metadata1)); - - ASSERT_EQ(123U, metadata1->get_active_set()); -} - -TEST_F(TestJournalMetadata, DisconnectLaggyClient) { - std::string oid = get_temp_oid(); - - ASSERT_EQ(0, create(oid)); - ASSERT_EQ(0, client_register(oid, "client1", "")); - ASSERT_EQ(0, client_register(oid, "client2", "laggy")); - - int max_concurrent_object_sets = 100; - journal::JournalMetadataPtr metadata = - create_metadata(oid, "client1", 0.1, 0, max_concurrent_object_sets); - ASSERT_EQ(0, init_metadata(metadata)); - ASSERT_TRUE(wait_for_update(metadata)); - - ASSERT_EQ(0U, metadata->get_active_set()); - - journal::JournalMetadata::RegisteredClients clients; - -#define ASSERT_CLIENT_STATES(s1, s2) \ - ASSERT_EQ(2U, clients.size()); \ - for (auto &c : clients) { \ - if (c.id == "client1") { \ - ASSERT_EQ(c.state, s1); \ - } else if (c.id == "client2") { \ - ASSERT_EQ(c.state, s2); \ - } else { \ - ASSERT_TRUE(false); \ - } \ - } - - metadata->get_registered_clients(&clients); - ASSERT_CLIENT_STATES(cls::journal::CLIENT_STATE_CONNECTED, - cls::journal::CLIENT_STATE_CONNECTED); - - // client2 is connected when active set <= max_concurrent_object_sets - ASSERT_EQ(0, metadata->set_active_set(max_concurrent_object_sets)); - ASSERT_TRUE(wait_for_update(metadata)); - uint64_t commit_tid = metadata->allocate_commit_tid(0, 0, 0); - C_SaferCond cond1; - metadata->committed(commit_tid, [&cond1]() { return &cond1; }); - ASSERT_EQ(0, cond1.wait()); - metadata->flush_commit_position(); - ASSERT_TRUE(wait_for_update(metadata)); - ASSERT_EQ(100U, metadata->get_active_set()); - clients.clear(); - metadata->get_registered_clients(&clients); - ASSERT_CLIENT_STATES(cls::journal::CLIENT_STATE_CONNECTED, - cls::journal::CLIENT_STATE_CONNECTED); - - // client2 is disconnected when active set > max_concurrent_object_sets - ASSERT_EQ(0, metadata->set_active_set(max_concurrent_object_sets + 1)); - ASSERT_TRUE(wait_for_update(metadata)); - commit_tid = metadata->allocate_commit_tid(0, 0, 1); - C_SaferCond cond2; - metadata->committed(commit_tid, [&cond2]() { return &cond2; }); - ASSERT_EQ(0, cond2.wait()); - metadata->flush_commit_position(); - ASSERT_TRUE(wait_for_update(metadata)); - ASSERT_EQ(101U, metadata->get_active_set()); - clients.clear(); - metadata->get_registered_clients(&clients); - ASSERT_CLIENT_STATES(cls::journal::CLIENT_STATE_CONNECTED, - cls::journal::CLIENT_STATE_DISCONNECTED); -} - -TEST_F(TestJournalMetadata, AssertActiveTag) { - std::string oid = get_temp_oid(); - - ASSERT_EQ(0, create(oid)); - ASSERT_EQ(0, client_register(oid, "client1", "")); - - journal::JournalMetadataPtr metadata = create_metadata(oid, "client1"); - ASSERT_EQ(0, init_metadata(metadata)); - ASSERT_TRUE(wait_for_update(metadata)); - - C_SaferCond ctx1; - cls::journal::Tag tag1; - metadata->allocate_tag(cls::journal::Tag::TAG_CLASS_NEW, {}, &tag1, &ctx1); - ASSERT_EQ(0, ctx1.wait()); - - C_SaferCond ctx2; - metadata->assert_active_tag(tag1.tid, &ctx2); - ASSERT_EQ(0, ctx2.wait()); - - C_SaferCond ctx3; - cls::journal::Tag tag2; - metadata->allocate_tag(tag1.tag_class, {}, &tag2, &ctx3); - ASSERT_EQ(0, ctx3.wait()); - - C_SaferCond ctx4; - metadata->assert_active_tag(tag1.tid, &ctx4); - ASSERT_EQ(-ESTALE, ctx4.wait()); -}