]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/seastore/onode_tree: add FLTreeOnodeManager unittest
authorSamuel Just <sjust@redhat.com>
Mon, 8 Mar 2021 20:38:01 +0000 (12:38 -0800)
committerSamuel Just <sjust@redhat.com>
Wed, 10 Mar 2021 07:01:32 +0000 (23:01 -0800)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h
src/test/crimson/seastore/onode_tree/CMakeLists.txt
src/test/crimson/seastore/onode_tree/test_fltree_onode_manager.cc [new file with mode: 0644]

index 48aeee7b98e21fc991e8948c9d2290ed0731814c..39cdf5ab91c7203b32d54b29708ec35dbb48ba7a 100644 (file)
@@ -116,5 +116,6 @@ public:
 
   ~FLTreeOnodeManager();
 };
+using FLTreeOnodeManagerRef = std::unique_ptr<FLTreeOnodeManager>;
 
 }
index 3a5eb037e3cbdd6328ef4c32f500f686314ae7ec..632e16b703571e786c7b0b04bf41ada94395cce5 100644 (file)
@@ -4,3 +4,10 @@ add_executable(unittest-staged-fltree
 add_ceph_unittest(unittest-staged-fltree)
 target_link_libraries(unittest-staged-fltree
   crimson-seastore)
+
+add_executable(unittest-fltree-onode-manager
+  test_fltree_onode_manager.cc
+  ../../gtest_seastar.cc)
+add_ceph_unittest(unittest-fltree-onode-manager)
+target_link_libraries(unittest-fltree-onode-manager
+  crimson-seastore)
diff --git a/src/test/crimson/seastore/onode_tree/test_fltree_onode_manager.cc b/src/test/crimson/seastore/onode_tree/test_fltree_onode_manager.cc
new file mode 100644 (file)
index 0000000..b48aa0f
--- /dev/null
@@ -0,0 +1,135 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include <string>
+#include <iostream>
+#include <sstream>
+
+#include "test/crimson/gtest_seastar.h"
+
+#include "test/crimson/seastore/transaction_manager_test_state.h"
+
+#include "crimson/os/futurized_collection.h"
+#include "crimson/os/seastore/onode_manager/staged-fltree/fltree_onode_manager.h"
+
+using namespace crimson;
+using namespace crimson::os;
+using namespace crimson::os::seastore;
+using namespace crimson::os::seastore::onode;
+using CTransaction = ceph::os::Transaction;
+using namespace std;
+
+namespace {
+  [[maybe_unused]] seastar::logger& logger() {
+    return crimson::get_logger(ceph_subsys_test);
+  }
+}
+
+ghobject_t make_oid(unsigned i) {
+  stringstream ss;
+  ss << "object_" << i;
+  auto ret = ghobject_t(
+    hobject_t(
+      sobject_t(ss.str(), CEPH_NOSNAP)));
+  ret.hobj.nspace = "asdf";
+  return ret;
+}
+
+struct fltree_onode_manager_test_t :
+  public seastar_test_suite_t,
+  TMTestState {
+  FLTreeOnodeManagerRef manager;
+
+  seastar::future<> set_up_fut() final {
+    return tm_setup();
+  }
+
+  seastar::future<> tear_down_fut() final {
+    return tm_teardown();
+  }
+
+
+  virtual void _init() final {
+    TMTestState::_init();
+    manager.reset(new FLTreeOnodeManager(*tm));
+  }
+
+  virtual void _destroy() final {
+    manager.reset();
+    TMTestState::_destroy();
+  }
+
+  virtual seastar::future<> _mkfs() final {
+    return TMTestState::_mkfs(
+    ).then([this] {
+      return seastar::do_with(
+       tm->create_transaction(),
+       [this](auto &t) {
+         return manager->mkfs(*t
+         ).safe_then([this, &t] {
+           return tm->submit_transaction(std::move(t));
+         }).handle_error(
+           crimson::ct_error::assert_all{
+             "Invalid error in _mkfs"
+           }
+         );
+       });
+    });
+  }
+
+  template <typename F>
+  void with_onodes_write(
+    std::vector<ghobject_t> oids,
+    F &&f) {
+    auto t = tm->create_transaction();
+    auto onodes = manager->get_or_create_onodes(
+      *t,
+      oids).unsafe_get0();
+    std::invoke(f, *t, onodes);
+    manager->write_dirty(
+      *t,
+      onodes
+    ).unsafe_get0();
+    tm->submit_transaction(std::move(t)).unsafe_get0();
+  }
+
+  template <typename F>
+  void with_onodes_write_range(
+    unsigned start,
+    unsigned end,
+    unsigned stride,
+    F &&f) {
+    std::vector<ghobject_t> oids;
+    for (unsigned i = start; i < end; i += stride) {
+      oids.emplace_back(make_oid(i));
+    }
+    with_onodes_write(std::move(oids), std::forward<F>(f));
+  }
+
+  template <typename F>
+  void with_onode_write(unsigned i, F &&f) {
+    with_onodes_write_range(
+      i,
+      i + 1,
+      1, [this, f=std::forward<F>(f)](auto &t, auto &onodes) {
+       assert(onodes.size() == 1);
+       std::invoke(f, t, *onodes[0]);
+      });
+  }
+
+  fltree_onode_manager_test_t() {}
+};
+
+TEST_F(fltree_onode_manager_test_t, touch)
+{
+  run_async([this] {
+    with_onode_write(0, [](auto &t, auto &onode) {
+      onode.get_mutable_layout(t);
+    });
+    /* Disabled pending fix
+    with_onode_write(0, [](auto &t, auto &onode) {
+      onode.get_mutable_layout(t);
+    });
+    */
+  });
+}