From 00c123cbc521e60edf249c01a636148ada2f05bf Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 30 Jun 2015 23:50:09 -0400 Subject: [PATCH] tests: updated tests for journal trimmer modifications Signed-off-by: Jason Dillaman --- src/test/Makefile-client.am | 1 + src/test/journal/RadosTestFixture.cc | 15 +- src/test/journal/RadosTestFixture.h | 21 +++ src/test/journal/test_JournalMetadata.cc | 39 +---- src/test/journal/test_JournalPlayer.cc | 2 +- src/test/journal/test_JournalRecorder.cc | 2 +- src/test/journal/test_JournalTrimmer.cc | 200 +++++++++++++++++++++++ 7 files changed, 242 insertions(+), 38 deletions(-) create mode 100644 src/test/journal/test_JournalTrimmer.cc diff --git a/src/test/Makefile-client.am b/src/test/Makefile-client.am index e64ff62c38797..9c7471117f531 100644 --- a/src/test/Makefile-client.am +++ b/src/test/Makefile-client.am @@ -308,6 +308,7 @@ unittest_journal_SOURCES = \ test/journal/test_JournalMetadata.cc \ test/journal/test_JournalPlayer.cc \ test/journal/test_JournalRecorder.cc \ + test/journal/test_JournalTrimmer.cc \ test/journal/test_ObjectPlayer.cc \ test/journal/test_ObjectRecorder.cc \ test/journal/RadosTestFixture.cc diff --git a/src/test/journal/RadosTestFixture.cc b/src/test/journal/RadosTestFixture.cc index 382fdea501885..2dbea5c0f145d 100644 --- a/src/test/journal/RadosTestFixture.cc +++ b/src/test/journal/RadosTestFixture.cc @@ -6,7 +6,7 @@ #include "include/stringify.h" RadosTestFixture::RadosTestFixture() - : m_timer_lock("m_timer_lock"), m_timer(NULL) { + : m_timer_lock("m_timer_lock"), m_timer(NULL), m_listener(this) { } void RadosTestFixture::SetUpTestCase() { @@ -69,6 +69,19 @@ bufferlist RadosTestFixture::create_payload(const std::string &payload) { return bl; } +bool RadosTestFixture::wait_for_update(journal::JournalMetadataPtr metadata) { + Mutex::Locker locker(m_listener.mutex); + while (m_listener.updates[metadata.get()] == 0) { + if (m_listener.cond.WaitInterval( + reinterpret_cast(m_ioctx.cct()), + m_listener.mutex, utime_t(10, 0)) != 0) { + return false; + } + } + --m_listener.updates[metadata.get()]; + return true; +} + std::string RadosTestFixture::_pool_name; librados::Rados RadosTestFixture::_rados; uint64_t RadosTestFixture::_oid_number = 0; diff --git a/src/test/journal/RadosTestFixture.h b/src/test/journal/RadosTestFixture.h index a58bdc251dfd6..c980bb8963f96 100644 --- a/src/test/journal/RadosTestFixture.h +++ b/src/test/journal/RadosTestFixture.h @@ -4,6 +4,7 @@ #include "test/librados/test.h" #include "common/Mutex.h" #include "common/Timer.h" +#include "journal/JournalMetadata.h" #include "cls/journal/cls_journal_types.h" #include "gtest/gtest.h" @@ -28,6 +29,24 @@ public: bufferlist create_payload(const std::string &payload); + struct Listener : public journal::JournalMetadata::Listener { + RadosTestFixture *test_fixture; + Mutex mutex; + Cond cond; + std::map updates; + + Listener(RadosTestFixture *_test_fixture) + : test_fixture(_test_fixture), mutex("mutex") {} + + virtual void handle_update(journal::JournalMetadata *metadata) { + Mutex::Locker locker(mutex); + ++updates[metadata]; + cond.Signal(); + } + }; + + bool wait_for_update(journal::JournalMetadataPtr metadata); + static std::string _pool_name; static librados::Rados _rados; static uint64_t _oid_number; @@ -36,4 +55,6 @@ public: Mutex m_timer_lock; SafeTimer *m_timer; + + Listener m_listener; }; diff --git a/src/test/journal/test_JournalMetadata.cc b/src/test/journal/test_JournalMetadata.cc index 78652c400603f..6a39ef8b19812 100644 --- a/src/test/journal/test_JournalMetadata.cc +++ b/src/test/journal/test_JournalMetadata.cc @@ -10,46 +10,13 @@ class TestJournalMetadata : public RadosTestFixture { public: - TestJournalMetadata() : m_listener(this) {} - - struct Listener : public journal::JournalMetadata::Listener { - TestJournalMetadata *test_fixture; - Mutex mutex; - Cond cond; - std::map updates; - - Listener(TestJournalMetadata *_test_fixture) - : test_fixture(_test_fixture), mutex("mutex") {} - - virtual void handle_update(journal::JournalMetadata *metadata) { - Mutex::Locker locker(mutex); - ++updates[metadata]; - cond.Signal(); - } - }; - journal::JournalMetadataPtr create_metadata(const std::string &oid, const std::string &client_id) { journal::JournalMetadataPtr metadata(new journal::JournalMetadata( - m_ioctx, oid, client_id)); + m_ioctx, oid, client_id, 0.1)); metadata->add_listener(&m_listener); return metadata; } - - bool wait_for_update(journal::JournalMetadataPtr metadata) { - Mutex::Locker locker(m_listener.mutex); - while (m_listener.updates[metadata.get()] == 0) { - if (m_listener.cond.WaitInterval( - reinterpret_cast(m_ioctx.cct()), - m_listener.mutex, utime_t(10, 0)) != 0) { - return false; - } - } - --m_listener.updates[metadata.get()]; - return true; - } - - Listener m_listener; }; TEST_F(TestJournalMetadata, JournalDNE) { @@ -95,7 +62,9 @@ TEST_F(TestJournalMetadata, SetCommitPositions) { cls::journal::EntryPosition("tag1", 122)); commit_position = journal::JournalMetadata::ObjectSetPosition(1, entry_positions); - metadata1->set_commit_position(commit_position); + C_SaferCond cond; + metadata1->set_commit_position(commit_position, &cond); + ASSERT_EQ(0, cond.wait()); ASSERT_TRUE(wait_for_update(metadata2)); metadata2->get_commit_position(&read_commit_position); diff --git a/src/test/journal/test_JournalPlayer.cc b/src/test/journal/test_JournalPlayer.cc index 555a943b150f9..c0b06a828d908 100644 --- a/src/test/journal/test_JournalPlayer.cc +++ b/src/test/journal/test_JournalPlayer.cc @@ -62,7 +62,7 @@ public: journal::JournalMetadataPtr create_metadata(const std::string &oid) { journal::JournalMetadataPtr metadata(new journal::JournalMetadata( - m_ioctx, oid, "client")); + m_ioctx, oid, "client", 0.1)); return metadata; } diff --git a/src/test/journal/test_JournalRecorder.cc b/src/test/journal/test_JournalRecorder.cc index e8488b634f5bd..9a2d44b27d6e1 100644 --- a/src/test/journal/test_JournalRecorder.cc +++ b/src/test/journal/test_JournalRecorder.cc @@ -24,7 +24,7 @@ public: journal::JournalMetadataPtr create_metadata(const std::string &oid) { journal::JournalMetadataPtr metadata(new journal::JournalMetadata( - m_ioctx, oid, "client")); + m_ioctx, oid, "client", 0.1)); return metadata; } diff --git a/src/test/journal/test_JournalTrimmer.cc b/src/test/journal/test_JournalTrimmer.cc new file mode 100644 index 0000000000000..b027e4e5785a3 --- /dev/null +++ b/src/test/journal/test_JournalTrimmer.cc @@ -0,0 +1,200 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#include "journal/JournalTrimmer.h" +#include "journal/JournalMetadata.h" +#include "test/journal/RadosTestFixture.h" +#include +#include + +class TestJournalTrimmer : public RadosTestFixture { +public: + + virtual void TearDown() { + for (std::list::iterator it = m_trimmers.begin(); + it != m_trimmers.end(); ++it) { + delete *it; + } + RadosTestFixture::TearDown(); + } + + using RadosTestFixture::client_register; + int client_register(const std::string &oid) { + return RadosTestFixture::client_register(oid, "client", ""); + } + + journal::JournalMetadataPtr create_metadata(const std::string &oid) { + journal::JournalMetadataPtr metadata(new journal::JournalMetadata( + m_ioctx, oid, "client", 0.1)); + metadata->add_listener(&m_listener); + return metadata; + } + + journal::JournalTrimmer *create_trimmer(const std::string &oid, + const journal::JournalMetadataPtr &metadata) { + journal::JournalTrimmer *trimmer(new journal::JournalTrimmer( + m_ioctx, oid + ".", metadata)); + m_trimmers.push_back(trimmer); + return trimmer; + } + + int assert_exists(const std::string &oid) { + librados::ObjectWriteOperation op; + op.assert_exists(); + return m_ioctx.operate(oid, &op); + } + + std::list m_trimmers; +}; + +TEST_F(TestJournalTrimmer, UpdateCommitPosition) { + std::string oid = get_temp_oid(); + ASSERT_EQ(0, create(oid, 12, 2)); + ASSERT_EQ(0, client_register(oid)); + + journal::JournalMetadataPtr metadata = create_metadata(oid); + ASSERT_EQ(0, metadata->init()); + ASSERT_TRUE(wait_for_update(metadata)); + + metadata->set_active_set(10); + ASSERT_TRUE(wait_for_update(metadata)); + + ASSERT_EQ(0, append(oid + ".0", create_payload("payload"))); + ASSERT_EQ(0, append(oid + ".2", create_payload("payload"))); + ASSERT_EQ(0, append(oid + ".3", create_payload("payload"))); + ASSERT_EQ(0, append(oid + ".5", create_payload("payload"))); + + journal::JournalTrimmer *trimmer = create_trimmer(oid, metadata); + + cls::journal::EntryPositions entry_positions; + cls::journal::ObjectSetPosition object_set_position(5, entry_positions); + + trimmer->update_commit_position(object_set_position); + + while (metadata->get_minimum_set() != 2U) { + ASSERT_TRUE(wait_for_update(metadata)); + } + + ASSERT_EQ(-ENOENT, assert_exists(oid + ".0")); + ASSERT_EQ(-ENOENT, assert_exists(oid + ".2")); + ASSERT_EQ(-ENOENT, assert_exists(oid + ".3")); + ASSERT_EQ(0, assert_exists(oid + ".5")); +} + +TEST_F(TestJournalTrimmer, ConcurrentUpdateCommitPosition) { + std::string oid = get_temp_oid(); + ASSERT_EQ(0, create(oid, 12, 2)); + ASSERT_EQ(0, client_register(oid)); + + journal::JournalMetadataPtr metadata1 = create_metadata(oid); + ASSERT_EQ(0, metadata1->init()); + ASSERT_TRUE(wait_for_update(metadata1)); + + metadata1->set_active_set(10); + ASSERT_TRUE(wait_for_update(metadata1)); + + journal::JournalMetadataPtr metadata2 = create_metadata(oid); + ASSERT_EQ(0, metadata2->init()); + + ASSERT_EQ(0, append(oid + ".0", create_payload("payload"))); + ASSERT_EQ(0, append(oid + ".2", create_payload("payload"))); + ASSERT_EQ(0, append(oid + ".3", create_payload("payload"))); + ASSERT_EQ(0, append(oid + ".5", create_payload("payload"))); + + journal::JournalTrimmer *trimmer1 = create_trimmer(oid, metadata1); + journal::JournalTrimmer *trimmer2 = create_trimmer(oid, metadata2); + + cls::journal::EntryPositions entry_positions; + cls::journal::ObjectSetPosition object_set_position1(2, entry_positions); + trimmer1->update_commit_position(object_set_position1); + + cls::journal::ObjectSetPosition object_set_position2(5, entry_positions); + trimmer2->update_commit_position(object_set_position2); + + while (metadata1->get_minimum_set() != 2U) { + ASSERT_TRUE(wait_for_update(metadata1)); + } + while (metadata2->get_minimum_set() != 2U) { + ASSERT_TRUE(wait_for_update(metadata2)); + } + + ASSERT_EQ(-ENOENT, assert_exists(oid + ".0")); + ASSERT_EQ(-ENOENT, assert_exists(oid + ".2")); + ASSERT_EQ(-ENOENT, assert_exists(oid + ".3")); + ASSERT_EQ(0, assert_exists(oid + ".5")); +} + +TEST_F(TestJournalTrimmer, UpdateCommitPositionWithOtherClient) { + std::string oid = get_temp_oid(); + ASSERT_EQ(0, create(oid, 12, 2)); + ASSERT_EQ(0, client_register(oid)); + ASSERT_EQ(0, client_register(oid, "client2", "slow client")); + + journal::JournalMetadataPtr metadata = create_metadata(oid); + ASSERT_EQ(0, metadata->init()); + ASSERT_TRUE(wait_for_update(metadata)); + + metadata->set_active_set(10); + ASSERT_TRUE(wait_for_update(metadata)); + + ASSERT_EQ(0, append(oid + ".0", create_payload("payload"))); + ASSERT_EQ(0, append(oid + ".2", create_payload("payload"))); + ASSERT_EQ(0, append(oid + ".3", create_payload("payload"))); + ASSERT_EQ(0, append(oid + ".5", create_payload("payload"))); + + journal::JournalTrimmer *trimmer = create_trimmer(oid, metadata); + + cls::journal::EntryPositions entry_positions; + cls::journal::ObjectSetPosition object_set_position(5, entry_positions); + + trimmer->update_commit_position(object_set_position); + ASSERT_TRUE(wait_for_update(metadata)); + + ASSERT_EQ(0, assert_exists(oid + ".0")); + ASSERT_EQ(0, assert_exists(oid + ".2")); + ASSERT_EQ(0, assert_exists(oid + ".3")); + ASSERT_EQ(0, assert_exists(oid + ".5")); +} + +TEST_F(TestJournalTrimmer, RemoveObjects) { + std::string oid = get_temp_oid(); + ASSERT_EQ(0, create(oid, 12, 2)); + ASSERT_EQ(0, client_register(oid)); + + journal::JournalMetadataPtr metadata = create_metadata(oid); + ASSERT_EQ(0, metadata->init()); + ASSERT_TRUE(wait_for_update(metadata)); + + metadata->set_active_set(10); + ASSERT_TRUE(wait_for_update(metadata)); + + ASSERT_EQ(0, append(oid + ".0", create_payload("payload"))); + ASSERT_EQ(0, append(oid + ".2", create_payload("payload"))); + ASSERT_EQ(0, append(oid + ".3", create_payload("payload"))); + ASSERT_EQ(0, append(oid + ".5", create_payload("payload"))); + + journal::JournalTrimmer *trimmer = create_trimmer(oid, metadata); + + ASSERT_EQ(0, trimmer->remove_objects()); + ASSERT_TRUE(wait_for_update(metadata)); + + ASSERT_EQ(-ENOENT, assert_exists(oid + ".0")); + ASSERT_EQ(-ENOENT, assert_exists(oid + ".2")); + ASSERT_EQ(-ENOENT, assert_exists(oid + ".3")); + ASSERT_EQ(-ENOENT, assert_exists(oid + ".5")); +} + +TEST_F(TestJournalTrimmer, RemoveObjectsWithOtherClient) { + std::string oid = get_temp_oid(); + ASSERT_EQ(0, create(oid, 12, 2)); + ASSERT_EQ(0, client_register(oid)); + ASSERT_EQ(0, client_register(oid, "client2", "other client")); + + journal::JournalMetadataPtr metadata = create_metadata(oid); + ASSERT_EQ(0, metadata->init()); + ASSERT_TRUE(wait_for_update(metadata)); + + journal::JournalTrimmer *trimmer = create_trimmer(oid, metadata); + ASSERT_EQ(-EBUSY, trimmer->remove_objects()); +} + -- 2.39.5