]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
tests: updated tests for journal trimmer modifications
authorJason Dillaman <dillaman@redhat.com>
Wed, 1 Jul 2015 03:50:09 +0000 (23:50 -0400)
committerJason Dillaman <dillaman@redhat.com>
Fri, 6 Nov 2015 01:42:41 +0000 (20:42 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/test/Makefile-client.am
src/test/journal/RadosTestFixture.cc
src/test/journal/RadosTestFixture.h
src/test/journal/test_JournalMetadata.cc
src/test/journal/test_JournalPlayer.cc
src/test/journal/test_JournalRecorder.cc
src/test/journal/test_JournalTrimmer.cc [new file with mode: 0644]

index e64ff62c387977b094e7188e46198df77e9c2766..9c7471117f531464be5eeef4f5a5f1fbcf611dac 100644 (file)
@@ -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
index 382fdea501885038ab0ddfb2c827fd1a74af98bb..2dbea5c0f145d285af765e95b81510307cfa0a74 100644 (file)
@@ -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<CephContext*>(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;
index a58bdc251dfd6100f046cdb39a965576ebe15cc0..c980bb8963f96b5487d86142184ad99ddacbbc5d 100644 (file)
@@ -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<journal::JournalMetadata*, uint32_t> 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;
 };
index 78652c400603fc523e52734d735bc6c271971ed9..6a39ef8b19812bb822f3f4adc0c9b5e1630ccc42 100644 (file)
 
 class TestJournalMetadata : public RadosTestFixture {
 public:
-  TestJournalMetadata() : m_listener(this) {}
-
-  struct Listener : public journal::JournalMetadata::Listener {
-    TestJournalMetadata *test_fixture;
-    Mutex mutex;
-    Cond cond;
-    std::map<journal::JournalMetadata*, uint32_t> 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<CephContext*>(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);
index 555a943b150f90c7a7d7c689ec5ff7c1387ebdd8..c0b06a828d9083fa17d5566fd909412c0bc786b9 100644 (file)
@@ -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;
   }
 
index e8488b634f5bdd68471b501cdf4166ea9daf1433..9a2d44b27d6e19d99558aa8e514e910282493628 100644 (file)
@@ -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 (file)
index 0000000..b027e4e
--- /dev/null
@@ -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 <limits>
+#include <list>
+
+class TestJournalTrimmer : public RadosTestFixture {
+public:
+
+  virtual void TearDown() {
+    for (std::list<journal::JournalTrimmer*>::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<journal::JournalTrimmer*> 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());
+}
+