From: Jason Dillaman Date: Wed, 15 Jul 2015 23:31:38 +0000 (-0400) Subject: tests: update journal tests based on API changes X-Git-Tag: v10.0.1~102^2~14 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d85ea50c768b338474e0d804ca48228e0666609d;p=ceph.git tests: update journal tests based on API changes Signed-off-by: Jason Dillaman --- diff --git a/src/test/journal/RadosTestFixture.cc b/src/test/journal/RadosTestFixture.cc index 2dbea5c0f145..2a6634baf8f5 100644 --- a/src/test/journal/RadosTestFixture.cc +++ b/src/test/journal/RadosTestFixture.cc @@ -69,6 +69,12 @@ bufferlist RadosTestFixture::create_payload(const std::string &payload) { return bl; } +int RadosTestFixture::init_metadata(journal::JournalMetadataPtr metadata) { + C_SaferCond cond; + metadata->init(&cond); + return cond.wait(); +} + bool RadosTestFixture::wait_for_update(journal::JournalMetadataPtr metadata) { Mutex::Locker locker(m_listener.mutex); while (m_listener.updates[metadata.get()] == 0) { diff --git a/src/test/journal/RadosTestFixture.h b/src/test/journal/RadosTestFixture.h index c980bb8963f9..3b05a7024da9 100644 --- a/src/test/journal/RadosTestFixture.h +++ b/src/test/journal/RadosTestFixture.h @@ -45,6 +45,8 @@ public: } }; + int init_metadata(journal::JournalMetadataPtr metadata); + bool wait_for_update(journal::JournalMetadataPtr metadata); static std::string _pool_name; diff --git a/src/test/journal/test_FutureImpl.cc b/src/test/journal/test_FutureImpl.cc index 021e8adbbbd5..370bf740a87c 100644 --- a/src/test/journal/test_FutureImpl.cc +++ b/src/test/journal/test_FutureImpl.cc @@ -3,12 +3,21 @@ #include "journal/FutureImpl.h" #include "common/Cond.h" +#include "common/Finisher.h" #include "common/Mutex.h" #include "gtest/gtest.h" +#include "test/journal/RadosTestFixture.h" -class TestFutureImpl : public ::testing::Test { +class TestFutureImpl : public RadosTestFixture { public: + TestFutureImpl() : m_finisher(NULL) { + } + ~TestFutureImpl() { + m_finisher->stop(); + delete m_finisher; + } + struct FlushHandler : public journal::FutureImpl::FlushHandler { uint64_t refs; uint64_t flushes; @@ -25,10 +34,17 @@ public: } }; + void SetUp() { + RadosTestFixture::SetUp(); + m_finisher = new Finisher(reinterpret_cast(m_ioctx.cct())); + m_finisher->start(); + } + journal::FutureImplPtr create_future(const std::string &tag, uint64_t tid, const journal::FutureImplPtr &prev = journal::FutureImplPtr()) { - journal::FutureImplPtr future(new journal::FutureImpl(tag, tid)); + journal::FutureImplPtr future(new journal::FutureImpl(*m_finisher, + tag, tid)); future->init(prev); return future; } @@ -36,6 +52,8 @@ public: void flush(const journal::FutureImplPtr &future) { } + Finisher *m_finisher; + FlushHandler m_flush_handler; }; diff --git a/src/test/journal/test_JournalMetadata.cc b/src/test/journal/test_JournalMetadata.cc index 6a39ef8b1981..1852718cad9f 100644 --- a/src/test/journal/test_JournalMetadata.cc +++ b/src/test/journal/test_JournalMetadata.cc @@ -23,7 +23,7 @@ TEST_F(TestJournalMetadata, JournalDNE) { std::string oid = get_temp_oid(); journal::JournalMetadataPtr metadata1 = create_metadata(oid, "client1"); - ASSERT_EQ(-ENOENT, metadata1->init()); + ASSERT_EQ(-ENOENT, init_metadata(metadata1)); } TEST_F(TestJournalMetadata, ClientDNE) { @@ -33,10 +33,10 @@ TEST_F(TestJournalMetadata, ClientDNE) { ASSERT_EQ(0, client_register(oid, "client1", "")); journal::JournalMetadataPtr metadata1 = create_metadata(oid, "client1"); - ASSERT_EQ(0, metadata1->init()); + ASSERT_EQ(0, init_metadata(metadata1)); journal::JournalMetadataPtr metadata2 = create_metadata(oid, "client2"); - ASSERT_EQ(-ENOENT, metadata2->init()); + ASSERT_EQ(-ENOENT, init_metadata(metadata2)); } TEST_F(TestJournalMetadata, SetCommitPositions) { @@ -46,10 +46,10 @@ TEST_F(TestJournalMetadata, SetCommitPositions) { ASSERT_EQ(0, client_register(oid, "client1", "")); journal::JournalMetadataPtr metadata1 = create_metadata(oid, "client1"); - ASSERT_EQ(0, metadata1->init()); + ASSERT_EQ(0, init_metadata(metadata1)); journal::JournalMetadataPtr metadata2 = create_metadata(oid, "client1"); - ASSERT_EQ(0, metadata2->init()); + ASSERT_EQ(0, init_metadata(metadata2)); ASSERT_TRUE(wait_for_update(metadata2)); journal::JournalMetadata::ObjectSetPosition commit_position; @@ -78,7 +78,7 @@ TEST_F(TestJournalMetadata, UpdateActiveObject) { ASSERT_EQ(0, client_register(oid, "client1", "")); journal::JournalMetadataPtr metadata1 = create_metadata(oid, "client1"); - ASSERT_EQ(0, metadata1->init()); + ASSERT_EQ(0, init_metadata(metadata1)); ASSERT_TRUE(wait_for_update(metadata1)); ASSERT_EQ(0U, metadata1->get_active_set()); diff --git a/src/test/journal/test_JournalPlayer.cc b/src/test/journal/test_JournalPlayer.cc index c0b06a828d90..cd640575f9d3 100644 --- a/src/test/journal/test_JournalPlayer.cc +++ b/src/test/journal/test_JournalPlayer.cc @@ -21,10 +21,12 @@ public: Mutex lock; Cond cond; bool entries_available; - bool error_occurred; + bool complete; + int complete_result; ReplayHandler() - : lock("lock"), entries_available(false), error_occurred(false) {} + : lock("lock"), entries_available(false), complete(false), + complete_result(0) {} virtual bool filter_entry(const std::string &tag) { return false; @@ -36,8 +38,11 @@ public: cond.Signal(); } - virtual void handle_error(int r) { - error_occurred = true; + virtual void handle_complete(int r) { + Mutex::Locker locker(lock); + complete = true; + complete_result = r; + cond.Signal(); } }; @@ -99,6 +104,23 @@ public: return entries->size() == count; } + bool wait_for_complete(journal::JournalPlayerPtr player) { + journal::Entry entry; + journal::JournalPlayer::ObjectSetPosition object_set_position; + player->try_pop_front(&entry, &object_set_position); + + Mutex::Locker locker(m_replay_hander.lock); + while (!m_replay_hander.complete) { + if (m_replay_hander.cond.WaitInterval( + reinterpret_cast(m_ioctx.cct()), + m_replay_hander.lock, utime_t(10, 0)) != 0) { + return false; + } + } + m_replay_hander.complete = false; + return true; + } + int write_entry(const std::string &oid, uint64_t object_num, const std::string &tag, uint64_t tid) { bufferlist bl; @@ -122,7 +144,7 @@ TEST_F(TestJournalPlayer, Prefetch) { ASSERT_EQ(0, client_commit(oid, commit_position)); journal::JournalMetadataPtr metadata = create_metadata(oid); - ASSERT_EQ(0, metadata->init()); + ASSERT_EQ(0, init_metadata(metadata)); journal::JournalPlayerPtr player = create_player(oid, metadata); @@ -135,6 +157,7 @@ TEST_F(TestJournalPlayer, Prefetch) { Entries entries; ASSERT_TRUE(wait_for_entries(player, 3, &entries)); + ASSERT_TRUE(wait_for_complete(player)); Entries expected_entries; expected_entries = boost::assign::list_of( @@ -158,7 +181,7 @@ TEST_F(TestJournalPlayer, PrefetchWithoutCommit) { ASSERT_EQ(0, client_commit(oid, commit_position)); journal::JournalMetadataPtr metadata = create_metadata(oid); - ASSERT_EQ(0, metadata->init()); + ASSERT_EQ(0, init_metadata(metadata)); journal::JournalPlayerPtr player = create_player(oid, metadata); @@ -169,6 +192,7 @@ TEST_F(TestJournalPlayer, PrefetchWithoutCommit) { Entries entries; ASSERT_TRUE(wait_for_entries(player, 2, &entries)); + ASSERT_TRUE(wait_for_complete(player)); Entries expected_entries; expected_entries = boost::assign::list_of( @@ -191,7 +215,7 @@ TEST_F(TestJournalPlayer, PrefetchMultipleTags) { ASSERT_EQ(0, client_commit(oid, commit_position)); journal::JournalMetadataPtr metadata = create_metadata(oid); - ASSERT_EQ(0, metadata->init()); + ASSERT_EQ(0, init_metadata(metadata)); journal::JournalPlayerPtr player = create_player(oid, metadata); @@ -208,6 +232,7 @@ TEST_F(TestJournalPlayer, PrefetchMultipleTags) { Entries entries; ASSERT_TRUE(wait_for_entries(player, 3, &entries)); + ASSERT_TRUE(wait_for_complete(player)); uint64_t last_tid; ASSERT_TRUE(metadata->get_last_allocated_tid("tag1", &last_tid)); @@ -226,7 +251,7 @@ TEST_F(TestJournalPlayer, PrefetchCorruptSequence) { ASSERT_EQ(0, client_commit(oid, commit_position)); journal::JournalMetadataPtr metadata = create_metadata(oid); - ASSERT_EQ(0, metadata->init()); + ASSERT_EQ(0, init_metadata(metadata)); journal::JournalPlayerPtr player = create_player(oid, metadata); @@ -242,7 +267,8 @@ TEST_F(TestJournalPlayer, PrefetchCorruptSequence) { journal::Entry entry; cls::journal::ObjectSetPosition object_set_position; ASSERT_FALSE(player->try_pop_front(&entry, &object_set_position)); - ASSERT_TRUE(m_replay_hander.error_occurred); + ASSERT_TRUE(wait_for_complete(player)); + ASSERT_NE(0, m_replay_hander.complete_result); } TEST_F(TestJournalPlayer, PrefetchAndWatch) { @@ -258,7 +284,7 @@ TEST_F(TestJournalPlayer, PrefetchAndWatch) { ASSERT_EQ(0, client_commit(oid, commit_position)); journal::JournalMetadataPtr metadata = create_metadata(oid); - ASSERT_EQ(0, metadata->init()); + ASSERT_EQ(0, init_metadata(metadata)); journal::JournalPlayerPtr player = create_player(oid, metadata); diff --git a/src/test/journal/test_JournalRecorder.cc b/src/test/journal/test_JournalRecorder.cc index 9a2d44b27d6e..73b3f35b2d1c 100644 --- a/src/test/journal/test_JournalRecorder.cc +++ b/src/test/journal/test_JournalRecorder.cc @@ -46,7 +46,7 @@ TEST_F(TestJournalRecorder, Append) { ASSERT_EQ(0, client_register(oid)); journal::JournalMetadataPtr metadata = create_metadata(oid); - ASSERT_EQ(0, metadata->init()); + ASSERT_EQ(0, init_metadata(metadata)); journal::JournalRecorder *recorder = create_recorder(oid, metadata); @@ -63,7 +63,7 @@ TEST_F(TestJournalRecorder, AppendKnownOverflow) { ASSERT_EQ(0, client_register(oid)); journal::JournalMetadataPtr metadata = create_metadata(oid); - ASSERT_EQ(0, metadata->init()); + ASSERT_EQ(0, init_metadata(metadata)); ASSERT_EQ(0U, metadata->get_active_set()); journal::JournalRecorder *recorder = create_recorder(oid, metadata); @@ -84,7 +84,7 @@ TEST_F(TestJournalRecorder, AppendDelayedOverflow) { ASSERT_EQ(0, client_register(oid)); journal::JournalMetadataPtr metadata = create_metadata(oid); - ASSERT_EQ(0, metadata->init()); + ASSERT_EQ(0, init_metadata(metadata)); ASSERT_EQ(0U, metadata->get_active_set()); journal::JournalRecorder *recorder1 = create_recorder(oid, metadata); @@ -108,7 +108,7 @@ TEST_F(TestJournalRecorder, FutureFlush) { ASSERT_EQ(0, client_register(oid)); journal::JournalMetadataPtr metadata = create_metadata(oid); - ASSERT_EQ(0, metadata->init()); + ASSERT_EQ(0, init_metadata(metadata)); journal::JournalRecorder *recorder = create_recorder(oid, metadata); @@ -128,18 +128,20 @@ TEST_F(TestJournalRecorder, Flush) { ASSERT_EQ(0, client_register(oid)); journal::JournalMetadataPtr metadata = create_metadata(oid); - ASSERT_EQ(0, metadata->init()); + ASSERT_EQ(0, init_metadata(metadata)); journal::JournalRecorder *recorder = create_recorder(oid, metadata); journal::Future future1 = recorder->append("tag1", create_payload("payload1")); journal::Future future2 = recorder->append("tag1", create_payload("payload2")); - recorder->flush(); + C_SaferCond cond1; + recorder->flush(&cond1); + ASSERT_EQ(0, cond1.wait()); - C_SaferCond cond; - future2.wait(&cond); - ASSERT_EQ(0, cond.wait()); + C_SaferCond cond2; + future2.wait(&cond2); + ASSERT_EQ(0, cond2.wait()); ASSERT_TRUE(future1.is_complete()); ASSERT_TRUE(future2.is_complete()); } diff --git a/src/test/journal/test_JournalTrimmer.cc b/src/test/journal/test_JournalTrimmer.cc index b027e4e5785a..80226df83527 100644 --- a/src/test/journal/test_JournalTrimmer.cc +++ b/src/test/journal/test_JournalTrimmer.cc @@ -53,7 +53,7 @@ TEST_F(TestJournalTrimmer, UpdateCommitPosition) { ASSERT_EQ(0, client_register(oid)); journal::JournalMetadataPtr metadata = create_metadata(oid); - ASSERT_EQ(0, metadata->init()); + ASSERT_EQ(0, init_metadata(metadata)); ASSERT_TRUE(wait_for_update(metadata)); metadata->set_active_set(10); @@ -87,14 +87,14 @@ TEST_F(TestJournalTrimmer, ConcurrentUpdateCommitPosition) { ASSERT_EQ(0, client_register(oid)); journal::JournalMetadataPtr metadata1 = create_metadata(oid); - ASSERT_EQ(0, metadata1->init()); + ASSERT_EQ(0, init_metadata(metadata1)); 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, init_metadata(metadata2)); ASSERT_EQ(0, append(oid + ".0", create_payload("payload"))); ASSERT_EQ(0, append(oid + ".2", create_payload("payload"))); @@ -131,7 +131,7 @@ TEST_F(TestJournalTrimmer, UpdateCommitPositionWithOtherClient) { ASSERT_EQ(0, client_register(oid, "client2", "slow client")); journal::JournalMetadataPtr metadata = create_metadata(oid); - ASSERT_EQ(0, metadata->init()); + ASSERT_EQ(0, init_metadata(metadata)); ASSERT_TRUE(wait_for_update(metadata)); metadata->set_active_set(10); @@ -162,7 +162,7 @@ TEST_F(TestJournalTrimmer, RemoveObjects) { ASSERT_EQ(0, client_register(oid)); journal::JournalMetadataPtr metadata = create_metadata(oid); - ASSERT_EQ(0, metadata->init()); + ASSERT_EQ(0, init_metadata(metadata)); ASSERT_TRUE(wait_for_update(metadata)); metadata->set_active_set(10); @@ -191,7 +191,7 @@ TEST_F(TestJournalTrimmer, RemoveObjectsWithOtherClient) { ASSERT_EQ(0, client_register(oid, "client2", "other client")); journal::JournalMetadataPtr metadata = create_metadata(oid); - ASSERT_EQ(0, metadata->init()); + ASSERT_EQ(0, init_metadata(metadata)); ASSERT_TRUE(wait_for_update(metadata)); journal::JournalTrimmer *trimmer = create_trimmer(oid, metadata); diff --git a/src/test/journal/test_Journaler.cc b/src/test/journal/test_Journaler.cc index 1086c720ff67..41b3071761fd 100644 --- a/src/test/journal/test_Journaler.cc +++ b/src/test/journal/test_Journaler.cc @@ -6,14 +6,15 @@ #include "gtest/gtest.h" #include "test/librados/test.h" #include "test/journal/RadosTestFixture.h" +#include "include/stringify.h" class TestJournaler : public RadosTestFixture { public: static const std::string CLIENT_ID; - static uint64_t get_temp_journal_id() { - return ++_journal_id; + static std::string get_temp_journal_id() { + return stringify(++_journal_id); } virtual void SetUp() { @@ -32,6 +33,12 @@ public: return m_journaler->create(order, splay_width); } + int init_journaler() { + C_SaferCond cond; + m_journaler->init(&cond); + return cond.wait(); + } + int register_client(const std::string &client_id, const std::string &desc) { journal::Journaler journaler(m_ioctx, m_ioctx, m_journal_id, client_id); return journaler.register_client(desc); @@ -39,7 +46,7 @@ public: static uint64_t _journal_id; - uint64_t m_journal_id; + std::string m_journal_id; journal::Journaler *m_journaler; }; @@ -64,11 +71,11 @@ TEST_F(TestJournaler, CreateInvalidParams) { TEST_F(TestJournaler, Init) { ASSERT_EQ(0, create_journal(12, 8)); ASSERT_EQ(0, register_client(CLIENT_ID, "foo")); - ASSERT_EQ(0, m_journaler->init()); + ASSERT_EQ(0, init_journaler()); } TEST_F(TestJournaler, InitDNE) { - ASSERT_EQ(-ENOENT, m_journaler->init()); + ASSERT_EQ(-ENOENT, init_journaler()); } TEST_F(TestJournaler, RegisterClientDuplicate) { diff --git a/src/test/journal/test_ObjectPlayer.cc b/src/test/journal/test_ObjectPlayer.cc index 2a32d0019c4d..5ec7f6997043 100644 --- a/src/test/journal/test_ObjectPlayer.cc +++ b/src/test/journal/test_ObjectPlayer.cc @@ -40,7 +40,7 @@ TEST_F(TestObjectPlayer, Fetch) { C_SaferCond cond; object->fetch(&cond); - ASSERT_EQ(0, cond.wait()); + ASSERT_LE(0, cond.wait()); journal::ObjectPlayer::Entries entries; object->get_entries(&entries); @@ -67,7 +67,7 @@ TEST_F(TestObjectPlayer, FetchLarge) { C_SaferCond cond; object->fetch(&cond); - ASSERT_EQ(0, cond.wait()); + ASSERT_LE(0, cond.wait()); journal::ObjectPlayer::Entries entries; object->get_entries(&entries); @@ -93,7 +93,7 @@ TEST_F(TestObjectPlayer, FetchDeDup) { C_SaferCond cond; object->fetch(&cond); - ASSERT_EQ(0, cond.wait()); + ASSERT_LE(0, cond.wait()); journal::ObjectPlayer::Entries entries; object->get_entries(&entries); @@ -170,7 +170,7 @@ TEST_F(TestObjectPlayer, FetchAppend) { C_SaferCond cond1; object->fetch(&cond1); - ASSERT_EQ(0, cond1.wait()); + ASSERT_LE(0, cond1.wait()); journal::ObjectPlayer::Entries entries; object->get_entries(&entries); @@ -186,7 +186,7 @@ TEST_F(TestObjectPlayer, FetchAppend) { C_SaferCond cond2; object->fetch(&cond2); - ASSERT_EQ(0, cond2.wait()); + ASSERT_LE(0, cond2.wait()); object->get_entries(&entries); ASSERT_EQ(2U, entries.size()); @@ -210,7 +210,7 @@ TEST_F(TestObjectPlayer, PopEntry) { C_SaferCond cond; object->fetch(&cond); - ASSERT_EQ(0, cond.wait()); + ASSERT_LE(0, cond.wait()); journal::ObjectPlayer::Entries entries; object->get_entries(&entries); @@ -239,7 +239,7 @@ TEST_F(TestObjectPlayer, Watch) { bufferlist bl; ::encode(entry1, bl); ASSERT_EQ(0, append(get_object_name(oid), bl)); - ASSERT_EQ(0, cond1.wait()); + ASSERT_LE(0, cond1.wait()); journal::ObjectPlayer::Entries entries; object->get_entries(&entries); @@ -255,7 +255,7 @@ TEST_F(TestObjectPlayer, Watch) { bl.clear(); ::encode(entry2, bl); ASSERT_EQ(0, append(get_object_name(oid), bl)); - ASSERT_EQ(0, cond2.wait()); + ASSERT_LE(0, cond2.wait()); object->get_entries(&entries); ASSERT_EQ(2U, entries.size()); diff --git a/src/test/journal/test_ObjectRecorder.cc b/src/test/journal/test_ObjectRecorder.cc index 88972069d729..e1ffb29bb23d 100644 --- a/src/test/journal/test_ObjectRecorder.cc +++ b/src/test/journal/test_ObjectRecorder.cc @@ -3,6 +3,7 @@ #include "journal/ObjectRecorder.h" #include "common/Cond.h" +#include "common/Finisher.h" #include "common/Mutex.h" #include "common/Timer.h" #include "gtest/gtest.h" @@ -16,10 +17,16 @@ public: TestObjectRecorder() : m_flush_interval(std::numeric_limits::max()), m_flush_bytes(std::numeric_limits::max()), - m_flush_age(600) + m_flush_age(600), + m_finisher(NULL) { } + ~TestObjectRecorder() { + m_finisher->stop(); + delete m_finisher; + } + struct OverflowHandler : public journal::ObjectRecorder::OverflowHandler { Mutex lock; Cond cond; @@ -42,6 +49,14 @@ public: double m_flush_age; OverflowHandler m_overflow_handler; + Finisher *m_finisher; + + void SetUp() { + RadosTestFixture::SetUp(); + m_finisher = new Finisher(reinterpret_cast(m_ioctx.cct())); + m_finisher->start(); + } + inline void set_flush_interval(uint32_t i) { m_flush_interval = i; } @@ -55,7 +70,8 @@ public: journal::AppendBuffer create_append_buffer(const std::string &tag, uint64_t tid, const std::string &payload) { - journal::FutureImplPtr future(new journal::FutureImpl(tag, tid)); + journal::FutureImplPtr future(new journal::FutureImpl(*m_finisher, + tag, tid)); future->init(journal::FutureImplPtr()); bufferlist bl; @@ -202,11 +218,13 @@ TEST_F(TestObjectRecorder, Flush) { ASSERT_FALSE(object->append(append_buffers)); ASSERT_EQ(1U, object->get_pending_appends()); - object->flush(); + C_SaferCond cond1; + object->flush(&cond1); + ASSERT_EQ(0, cond1.wait()); - C_SaferCond cond; - append_buffer1.first->wait(&cond); - ASSERT_EQ(0, cond.wait()); + C_SaferCond cond2; + append_buffer1.first->wait(&cond2); + ASSERT_EQ(0, cond2.wait()); ASSERT_EQ(0U, object->get_pending_appends()); }