]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
tests: fix journal test issues discovered via valgrind
authorJason Dillaman <dillaman@redhat.com>
Thu, 16 Jul 2015 18:42:30 +0000 (14:42 -0400)
committerJason Dillaman <dillaman@redhat.com>
Fri, 6 Nov 2015 01:42:42 +0000 (20:42 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/test/journal/RadosTestFixture.cc
src/test/journal/test_FutureImpl.cc
src/test/journal/test_JournalMetadata.cc
src/test/journal/test_JournalPlayer.cc
src/test/journal/test_JournalTrimmer.cc
src/test/journal/test_ObjectPlayer.cc
src/test/journal/test_ObjectRecorder.cc

index 2a6634baf8f5e08406a75b2246460352958c2e43..36282fd3f1b3a57ae9a149c6b7f3a307e627a4a5 100644 (file)
@@ -26,7 +26,7 @@ std::string RadosTestFixture::get_temp_oid() {
 void RadosTestFixture::SetUp() {
   ASSERT_EQ(0, _rados.ioctx_create(_pool_name.c_str(), m_ioctx));
   m_timer = new SafeTimer(reinterpret_cast<CephContext*>(m_ioctx.cct()),
-                          m_timer_lock, false);
+                          m_timer_lock, true);
   m_timer->init();
 }
 
index 370bf740a87c2a5ce56655c1c7f837b240ac3975..943c764dcf5349c4fff937a59fd66a5386325335 100644 (file)
@@ -145,6 +145,8 @@ TEST_F(TestFutureImpl, FlushInProgress) {
 
   future1->flush(NULL);
   ASSERT_EQ(0U, m_flush_handler.flushes);
+
+  future1->safe(0);
 }
 
 TEST_F(TestFutureImpl, FlushAlreadyComplete) {
index 1852718cad9f39eee9a6a801b739669f74076bba..fc4fd0f5a2b262c1a225177b1a4a67e82a0b9493 100644 (file)
 
 class TestJournalMetadata : public RadosTestFixture {
 public:
+  virtual void TearDown() {
+    for (MetadataList::iterator it = m_metadata_list.begin();
+         it != m_metadata_list.end(); ++it) {
+      (*it)->remove_listener(&m_listener);
+    }
+    RadosTestFixture::TearDown();
+  }
+
   journal::JournalMetadataPtr create_metadata(const std::string &oid,
                                               const std::string &client_id) {
     journal::JournalMetadataPtr metadata(new journal::JournalMetadata(
       m_ioctx, oid, client_id, 0.1));
+    m_metadata_list.push_back(metadata);
     metadata->add_listener(&m_listener);
     return metadata;
   }
+
+  typedef std::list<journal::JournalMetadataPtr> MetadataList;
+  MetadataList m_metadata_list;
 };
 
 TEST_F(TestJournalMetadata, JournalDNE) {
index cd640575f9d30825c87f14832ef8536e68d09ec3..6a0663f24715e618d58fbf46ebcaafea11ab0b69 100644 (file)
@@ -15,6 +15,7 @@
 
 class TestJournalPlayer : public RadosTestFixture {
 public:
+  typedef std::list<journal::JournalPlayer *> JournalPlayers;
   typedef std::list<journal::Entry> Entries;
 
   struct ReplayHandler : public journal::ReplayHandler {
@@ -28,6 +29,9 @@ public:
       : lock("lock"), entries_available(false), complete(false),
         complete_result(0) {}
 
+    virtual void get() {}
+    virtual void put() {}
+
     virtual bool filter_entry(const std::string &tag) {
       return false;
     }
@@ -46,6 +50,14 @@ public:
     }
   };
 
+  virtual void TearDown() {
+    for (JournalPlayers::iterator it = m_players.begin();
+         it != m_players.end(); ++it) {
+      delete *it;
+    }
+    RadosTestFixture::TearDown();
+  }
+
   int create(const std::string &oid) {
     return RadosTestFixture::create(oid, 14, 2);
   }
@@ -71,14 +83,15 @@ public:
     return metadata;
   }
 
-  journal::JournalPlayerPtr create_player(const std::string &oid,
+  journal::JournalPlayer *create_player(const std::string &oid,
                                           const journal::JournalMetadataPtr &metadata) {
-    journal::JournalPlayerPtr player(new journal::JournalPlayer(
+    journal::JournalPlayer *player(new journal::JournalPlayer(
       m_ioctx, oid + ".", metadata, &m_replay_hander));
+    m_players.push_back(player);
     return player;
   }
 
-  bool wait_for_entries(journal::JournalPlayerPtr player, uint32_t count,
+  bool wait_for_entries(journal::JournalPlayer *player, uint32_t count,
                         Entries *entries) {
     entries->clear();
     while (entries->size() < count) {
@@ -104,7 +117,7 @@ public:
     return entries->size() == count;
   }
 
-  bool wait_for_complete(journal::JournalPlayerPtr player) {
+  bool wait_for_complete(journal::JournalPlayer *player) {
     journal::Entry entry;
     journal::JournalPlayer::ObjectSetPosition object_set_position;
     player->try_pop_front(&entry, &object_set_position);
@@ -128,6 +141,7 @@ public:
     return append(oid + "." + stringify(object_num), bl);
   }
 
+  JournalPlayers m_players;
   ReplayHandler m_replay_hander;
 };
 
@@ -146,7 +160,7 @@ TEST_F(TestJournalPlayer, Prefetch) {
   journal::JournalMetadataPtr metadata = create_metadata(oid);
   ASSERT_EQ(0, init_metadata(metadata));
 
-  journal::JournalPlayerPtr player = create_player(oid, metadata);
+  journal::JournalPlayer *player = create_player(oid, metadata);
 
   ASSERT_EQ(0, write_entry(oid, 0, "tag1", 122));
   ASSERT_EQ(0, write_entry(oid, 1, "tag1", 123));
@@ -183,7 +197,7 @@ TEST_F(TestJournalPlayer, PrefetchWithoutCommit) {
   journal::JournalMetadataPtr metadata = create_metadata(oid);
   ASSERT_EQ(0, init_metadata(metadata));
 
-  journal::JournalPlayerPtr player = create_player(oid, metadata);
+  journal::JournalPlayer *player = create_player(oid, metadata);
 
   ASSERT_EQ(0, write_entry(oid, 0, "tag1", 122));
   ASSERT_EQ(0, write_entry(oid, 1, "tag1", 123));
@@ -217,7 +231,7 @@ TEST_F(TestJournalPlayer, PrefetchMultipleTags) {
   journal::JournalMetadataPtr metadata = create_metadata(oid);
   ASSERT_EQ(0, init_metadata(metadata));
 
-  journal::JournalPlayerPtr player = create_player(oid, metadata);
+  journal::JournalPlayer *player = create_player(oid, metadata);
 
   ASSERT_EQ(0, write_entry(oid, 0, "tag1", 120));
   ASSERT_EQ(0, write_entry(oid, 0, "tag2", 0));
@@ -253,7 +267,7 @@ TEST_F(TestJournalPlayer, PrefetchCorruptSequence) {
   journal::JournalMetadataPtr metadata = create_metadata(oid);
   ASSERT_EQ(0, init_metadata(metadata));
 
-  journal::JournalPlayerPtr player = create_player(oid, metadata);
+  journal::JournalPlayer *player = create_player(oid, metadata);
 
   ASSERT_EQ(0, write_entry(oid, 0, "tag1", 120));
   ASSERT_EQ(0, write_entry(oid, 0, "tag2", 0));
@@ -286,7 +300,7 @@ TEST_F(TestJournalPlayer, PrefetchAndWatch) {
   journal::JournalMetadataPtr metadata = create_metadata(oid);
   ASSERT_EQ(0, init_metadata(metadata));
 
-  journal::JournalPlayerPtr player = create_player(oid, metadata);
+  journal::JournalPlayer *player = create_player(oid, metadata);
 
   ASSERT_EQ(0, write_entry(oid, 0, "tag1", 122));
 
index 80226df835279ccacb67b469d2d2f0d1a5bdf386..f715affb0c4fe2ef629035e98acfa327f655c412 100644 (file)
@@ -11,6 +11,10 @@ class TestJournalTrimmer : public RadosTestFixture {
 public:
 
   virtual void TearDown() {
+    for (MetadataList::iterator it = m_metadata_list.begin();
+         it != m_metadata_list.end(); ++it) {
+      (*it)->remove_listener(&m_listener);
+    }
     for (std::list<journal::JournalTrimmer*>::iterator it = m_trimmers.begin();
          it != m_trimmers.end(); ++it) {
       delete *it;
@@ -26,6 +30,7 @@ public:
   journal::JournalMetadataPtr create_metadata(const std::string &oid) {
     journal::JournalMetadataPtr metadata(new journal::JournalMetadata(
       m_ioctx, oid, "client", 0.1));
+    m_metadata_list.push_back(metadata);
     metadata->add_listener(&m_listener);
     return metadata;
   }
@@ -44,6 +49,8 @@ public:
     return m_ioctx.operate(oid, &op);
   }
 
+  typedef std::list<journal::JournalMetadataPtr> MetadataList;
+  MetadataList m_metadata_list;
   std::list<journal::JournalTrimmer*> m_trimmers;
 };
 
index 5ec7f6997043459b64800fbabfc5a2f785e21c46..f00c053cdc6f8288a1f04b4add4bf37a133800c3 100644 (file)
@@ -274,6 +274,8 @@ TEST_F(TestObjectPlayer, Unwatch) {
   int rval = 0;
   C_SafeCond *ctx = new C_SafeCond(&mutex, &cond, &done, &rval);
   object->watch(ctx, 0.1);
+
+  usleep(200000);
   ASSERT_FALSE(done);
   object->unwatch();
 }
index e1ffb29bb23dad48040b24ecbda9e7ef7b42d070..50e9503f98dfd26e2eb6c69b0c1ac0fe7eab558f 100644 (file)
@@ -44,6 +44,10 @@ public:
     }
   };
 
+  typedef std::list<journal::ObjectRecorderPtr> ObjectRecorders;
+
+  ObjectRecorders m_object_recorders;
+
   uint32_t m_flush_interval;
   uint64_t m_flush_bytes;
   double m_flush_age;
@@ -57,6 +61,16 @@ public:
     m_finisher->start();
   }
 
+  void TearDown() {
+    for (ObjectRecorders::iterator it = m_object_recorders.begin();
+         it != m_object_recorders.end(); ++it) {
+      C_SaferCond cond;
+      (*it)->flush(&cond);
+      cond.wait();
+    }
+    RadosTestFixture::TearDown();
+  }
+
   inline void set_flush_interval(uint32_t i) {
     m_flush_interval = i;
   }
@@ -84,6 +98,7 @@ public:
     journal::ObjectRecorderPtr object(new journal::ObjectRecorder(
       m_ioctx, oid, 0, *m_timer, m_timer_lock, &m_overflow_handler, order,
       m_flush_interval, m_flush_bytes, m_flush_age));
+    m_object_recorders.push_back(object);
     return object;
   }
 };