From 625844491355ce432a053d403c0eeb76f5e449a3 Mon Sep 17 00:00:00 2001 From: Josh Durgin Date: Wed, 12 Jul 2017 17:29:36 -0400 Subject: [PATCH] TestPGLog: add unit tests for rebuilding missing set Signed-off-by: Josh Durgin --- src/test/objectstore/store_test_fixture.h | 2 +- src/test/osd/CMakeLists.txt | 3 +- src/test/osd/TestPGLog.cc | 85 ++++++++++++++++++++++- 3 files changed, 87 insertions(+), 3 deletions(-) diff --git a/src/test/objectstore/store_test_fixture.h b/src/test/objectstore/store_test_fixture.h index 8d65f2a0578..e90943a4448 100644 --- a/src/test/objectstore/store_test_fixture.h +++ b/src/test/objectstore/store_test_fixture.h @@ -4,7 +4,7 @@ class ObjectStore; -class StoreTestFixture : public ::testing::Test { +class StoreTestFixture : virtual public ::testing::Test { const std::string type; const std::string data_dir; diff --git a/src/test/osd/CMakeLists.txt b/src/test/osd/CMakeLists.txt index 037fa41759e..6297e8a03a1 100644 --- a/src/test/osd/CMakeLists.txt +++ b/src/test/osd/CMakeLists.txt @@ -64,9 +64,10 @@ target_link_libraries(unittest_osdscrub osd os global ${CMAKE_DL_LIBS} mon ${BLK add_executable(unittest_pglog TestPGLog.cc $ + $ ) add_ceph_unittest(unittest_pglog ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_pglog) -target_link_libraries(unittest_pglog osd global ${CMAKE_DL_LIBS} ${BLKID_LIBRARIES}) +target_link_libraries(unittest_pglog osd os global ${CMAKE_DL_LIBS} ${BLKID_LIBRARIES}) # unittest_hitset add_executable(unittest_hitset diff --git a/src/test/osd/TestPGLog.cc b/src/test/osd/TestPGLog.cc index 35b1ec49fc7..993dba2cbe4 100644 --- a/src/test/osd/TestPGLog.cc +++ b/src/test/osd/TestPGLog.cc @@ -25,8 +25,9 @@ #include "osd/PGLog.h" #include "osd/OSDMap.h" #include "include/coredumpctl.h" +#include "../objectstore/store_test_fixture.h" -class PGLogTest : public ::testing::Test, protected PGLog { +class PGLogTest : virtual public ::testing::Test, protected PGLog { public: PGLogTest() : PGLog(g_ceph_context) {} void SetUp() override { @@ -43,6 +44,7 @@ public: ss << "obj_" << id; hoid.oid = ss.str(); hoid.set_hash(id); + hoid.pool = 1; return hoid; } static eversion_t mk_evt(unsigned ep, unsigned v) { @@ -2219,6 +2221,87 @@ TEST_F(PGLogTest, ErrorNotIndexedByObject) { EXPECT_EQ(del.reqid, entry->reqid); } +class PGLogTestRebuildMissing : public PGLogTest, public StoreTestFixture { +public: + PGLogTestRebuildMissing() : PGLogTest(), StoreTestFixture("memstore") {} + void SetUp() override { + StoreTestFixture::SetUp(); + ObjectStore::Sequencer osr(__func__); + ObjectStore::Transaction t; + test_coll = coll_t(spg_t(pg_t(1, 1))); + t.create_collection(test_coll, 0); + store->apply_transaction(&osr, std::move(t)); + existing_oid = mk_obj(0); + nonexistent_oid = mk_obj(1); + ghobject_t existing_ghobj(existing_oid); + object_info_t existing_info; + existing_info.version = eversion_t(6, 2); + bufferlist enc_oi; + ::encode(existing_info, enc_oi, 0); + ObjectStore::Transaction t2; + t2.touch(test_coll, ghobject_t(existing_oid)); + t2.setattr(test_coll, ghobject_t(existing_oid), OI_ATTR, enc_oi); + ASSERT_EQ(0u, store->apply_transaction(&osr, std::move(t2))); + info.last_backfill = hobject_t::get_max(); + info.last_complete = eversion_t(); + } + + void TearDown() override { + clear(); + missing.may_include_deletes = false; + StoreTestFixture::TearDown(); + } + + pg_info_t info; + coll_t test_coll; + hobject_t existing_oid, nonexistent_oid; + + void run_rebuild_missing_test(const map &expected_missing_items) { + rebuild_missing_set_with_deletes(store.get(), test_coll, info); + ASSERT_EQ(expected_missing_items, missing.get_items()); + } +}; + +TEST_F(PGLogTestRebuildMissing, EmptyLog) { + missing.add(existing_oid, mk_evt(6, 2), mk_evt(6, 3), false); + missing.add(nonexistent_oid, mk_evt(7, 4), mk_evt(0, 0), false); + map orig_missing = missing.get_items(); + run_rebuild_missing_test(orig_missing); +} + +TEST_F(PGLogTestRebuildMissing, SameVersionMod) { + missing.add(existing_oid, mk_evt(6, 2), mk_evt(6, 1), false); + log.add(mk_ple_mod(existing_oid, mk_evt(6, 2), mk_evt(6, 1))); + map empty_missing; + run_rebuild_missing_test(empty_missing); +} + +TEST_F(PGLogTestRebuildMissing, DelExisting) { + missing.add(existing_oid, mk_evt(6, 3), mk_evt(6, 2), false); + log.add(mk_ple_dt(existing_oid, mk_evt(7, 5), mk_evt(7, 4))); + map expected; + expected[existing_oid] = pg_missing_item(mk_evt(7, 5), mk_evt(6, 2), true); + run_rebuild_missing_test(expected); +} + +TEST_F(PGLogTestRebuildMissing, DelNonexistent) { + log.add(mk_ple_dt(nonexistent_oid, mk_evt(7, 5), mk_evt(7, 4))); + map expected; + expected[nonexistent_oid] = pg_missing_item(mk_evt(7, 5), mk_evt(0, 0), true); + run_rebuild_missing_test(expected); +} + +TEST_F(PGLogTestRebuildMissing, MissingNotInLog) { + missing.add(mk_obj(10), mk_evt(8, 12), mk_evt(8, 10), false); + log.add(mk_ple_dt(nonexistent_oid, mk_evt(7, 5), mk_evt(7, 4))); + map expected; + expected[nonexistent_oid] = pg_missing_item(mk_evt(7, 5), mk_evt(0, 0), true); + expected[mk_obj(10)] = pg_missing_item(mk_evt(8, 12), mk_evt(8, 10), false); + run_rebuild_missing_test(expected); +} + + + // Local Variables: // compile-command: "cd ../.. ; make unittest_pglog ; ./unittest_pglog --log-to-stderr=true --debug-osd=20 # --gtest_filter=*.* " // End: -- 2.39.5