]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/onode-staged-tree: add asynchronous dummy backend
authorYingxin Cheng <yingxin.cheng@intel.com>
Fri, 9 Oct 2020 06:43:52 +0000 (14:43 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Tue, 1 Dec 2020 04:50:54 +0000 (12:50 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager.cc
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager.h
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/dummy.h
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/seastore.h
src/test/crimson/seastore/onode_tree/test_staged_fltree.cc

index 667ae6a36077afdc2589a4e83fb71b04e0ead877..21a08b0596929e7550e63d82f16b15c275bfccb6 100644 (file)
@@ -7,8 +7,12 @@
 
 namespace crimson::os::seastore::onode {
 
-NodeExtentManagerURef NodeExtentManager::create_dummy() {
-  return NodeExtentManagerURef(new DummyNodeExtentManager());
+NodeExtentManagerURef NodeExtentManager::create_dummy(bool is_sync) {
+  if (is_sync) {
+    return NodeExtentManagerURef(new DummyNodeExtentManager<true>());
+  } else {
+    return NodeExtentManagerURef(new DummyNodeExtentManager<false>());
+  }
 }
 
 NodeExtentManagerURef NodeExtentManager::create_seastore(
index 1973b80b15925c4d31b02372f91d99c6e12faba4..1f85c9d3cb4255ecd6d76bc996191deb44cc6dc3 100644 (file)
@@ -60,7 +60,7 @@ class NodeExtentManager {
   virtual tm_future<NodeExtentRef> alloc_extent(Transaction&, extent_len_t) = 0;
   virtual tm_future<Super::URef> get_super(Transaction&, RootNodeTracker&) = 0;
 
-  static NodeExtentManagerURef create_dummy();
+  static NodeExtentManagerURef create_dummy(bool is_sync);
   static NodeExtentManagerURef create_seastore(
       TransactionManager& tm, laddr_t min_laddr = L_ADDR_MIN);
 };
index 49c56357b56f5d9f15f336c0ab732c9fc4976653..de0142680f77c5089ee1dd29ea68063ce262fed9 100644 (file)
@@ -3,6 +3,9 @@
 
 #pragma once
 
+#include <chrono>
+#include <seastar/core/sleep.hh>
+
 #include "include/buffer_raw.h"
 
 #include "crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager.h"
@@ -39,14 +42,52 @@ class DummyNodeExtent final: public NodeExtent {
     assert(false && "impossible path"); }
 };
 
+template <bool SYNC>
 class DummyNodeExtentManager final: public NodeExtentManager {
   static constexpr size_t ALIGNMENT = 4096;
  public:
   ~DummyNodeExtentManager() override = default;
  protected:
-  bool is_read_isolated() const { return false; }
+  bool is_read_isolated() const override { return false; }
 
   tm_future<NodeExtentRef> read_extent(
+      Transaction& t, laddr_t addr, extent_len_t len) override {
+    if constexpr (SYNC) {
+      return read_extent_sync(t, addr, len);
+    } else {
+      using namespace std::chrono_literals;
+      return seastar::sleep(1us).then([this, &t, addr, len] {
+        return read_extent_sync(t, addr, len);
+      });
+    }
+  }
+
+  tm_future<NodeExtentRef> alloc_extent(
+      Transaction& t, extent_len_t len) override {
+    if constexpr (SYNC) {
+      return alloc_extent_sync(t, len);
+    } else {
+      using namespace std::chrono_literals;
+      return seastar::sleep(1us).then([this, &t, len] {
+        return alloc_extent_sync(t, len);
+      });
+    }
+  }
+
+  tm_future<Super::URef> get_super(
+      Transaction& t, RootNodeTracker& tracker) override {
+    if constexpr (SYNC) {
+      return get_super_sync(t, tracker);
+    } else {
+      using namespace std::chrono_literals;
+      return seastar::sleep(1us).then([this, &t, &tracker] {
+        return get_super_sync(t, tracker);
+      });
+    }
+  }
+
+ private:
+  tm_future<NodeExtentRef> read_extent_sync(
       Transaction& t, laddr_t addr, extent_len_t len) {
     auto iter = allocate_map.find(addr);
     assert(iter != allocate_map.end());
@@ -54,7 +95,7 @@ class DummyNodeExtentManager final: public NodeExtentManager {
     return tm_ertr::make_ready_future<NodeExtentRef>(iter->second);
   }
 
-  tm_future<NodeExtentRef> alloc_extent(
+  tm_future<NodeExtentRef> alloc_extent_sync(
       Transaction& t, extent_len_t len) {
     assert(len % ALIGNMENT == 0);
     auto r = ceph::buffer::create_aligned(len, ALIGNMENT);
@@ -67,7 +108,8 @@ class DummyNodeExtentManager final: public NodeExtentManager {
     return tm_ertr::make_ready_future<NodeExtentRef>(extent);
   }
 
-  tm_future<Super::URef> get_super(Transaction& t, RootNodeTracker& tracker) {
+  tm_future<Super::URef> get_super_sync(
+      Transaction& t, RootNodeTracker& tracker) {
     return tm_ertr::make_ready_future<Super::URef>(
         Super::URef(new DummySuper(t, tracker, &root_laddr)));
   }
index c262489e7528536f08f5e24247509dcb0cee822c..e041a68dec168608792a9ff29ba188c236be9365 100644 (file)
@@ -56,10 +56,10 @@ class SeastoreNodeExtentManager final: public NodeExtentManager {
   ~SeastoreNodeExtentManager() override = default;
   TransactionManager& get_tm() { return tm; }
  protected:
-  bool is_read_isolated() const { return true; }
+  bool is_read_isolated() const override { return true; }
 
   tm_future<NodeExtentRef> read_extent(
-      Transaction& t, laddr_t addr, extent_len_t len) {
+      Transaction& t, laddr_t addr, extent_len_t len) override {
     return tm.read_extents<SeastoreNodeExtent>(t, addr, len
     ).safe_then([](auto&& extents) {
       assert(extents.size() == 1);
@@ -69,14 +69,15 @@ class SeastoreNodeExtentManager final: public NodeExtentManager {
   }
 
   tm_future<NodeExtentRef> alloc_extent(
-      Transaction& t, extent_len_t len) {
+      Transaction& t, extent_len_t len) override {
     return tm.alloc_extent<SeastoreNodeExtent>(t, addr_min, len
     ).safe_then([](auto extent) {
       return NodeExtentRef(extent);
     });
   }
 
-  tm_future<Super::URef> get_super(Transaction& t, RootNodeTracker& tracker) {
+  tm_future<Super::URef> get_super(
+      Transaction& t, RootNodeTracker& tracker) override {
     return tm.read_onode_root(t).safe_then([this, &t, &tracker](auto root_addr) {
       return Super::URef(new SeastoreSuper(t, tracker, root_addr, tm));
     });
index d88d4fe0bea3cc5c62fe6dce0c882f7c9b84bc62..cd5b9c5e465226b4193e142f91d90b62d5876740 100644 (file)
@@ -222,7 +222,7 @@ TEST_F(a_basic_test_t, 1_basic_sizes)
 TEST_F(a_basic_test_t, 2_node_sizes)
 {
   run_async([this] {
-    auto nm = NodeExtentManager::create_dummy();
+    auto nm = NodeExtentManager::create_dummy(false);
     auto t = make_transaction();
     context_t c{*nm, *t};
     std::array<std::pair<NodeImplURef, NodeExtentMutable>, 16> nodes = {
@@ -262,7 +262,7 @@ struct b_dummy_tree_test_t : public seastar_test_suite_t {
   Btree tree;
 
   b_dummy_tree_test_t()
-    : moved_nm{NodeExtentManager::create_dummy()},
+    : moved_nm{NodeExtentManager::create_dummy(false)},
       ref_t{make_transaction()},
       t{*ref_t},
       c{*moved_nm, t},
@@ -467,7 +467,7 @@ class TestTree {
 
  public:
   TestTree()
-    : moved_nm{NodeExtentManager::create_dummy()},
+    : moved_nm{NodeExtentManager::create_dummy(false)},
       ref_t{make_transaction()},
       t{*ref_t},
       c{*moved_nm, t},
@@ -501,7 +501,7 @@ class TestTree {
 
   seastar::future<> split(const ghobject_t& key, const onode_t& value) {
     return seastar::async([this, key, &value] {
-      Btree tree_clone(NodeExtentManager::create_dummy());
+      Btree tree_clone(NodeExtentManager::create_dummy(false));
       auto ref_t_clone = make_transaction();
       Transaction& t_clone = *ref_t_clone;
       tree_clone.test_clone_from(t_clone, t, tree).unsafe_get0();
@@ -821,7 +821,7 @@ class DummyChildPool {
     reset();
 
     // create tree
-    auto ref_nm = NodeExtentManager::create_dummy();
+    auto ref_nm = NodeExtentManager::create_dummy(false);
     p_nm = ref_nm.get();
     p_btree.emplace(std::move(ref_nm));
     return DummyChild::create_initial(get_context(), keys, *this, *p_btree->root_tracker
@@ -856,7 +856,7 @@ class DummyChildPool {
       logger().info("insert {} at {}:", key_hobj_t(key), pos);
       DummyChildPool pool_clone;
       pool_clone_in_progress = &pool_clone;
-      auto ref_nm = NodeExtentManager::create_dummy();
+      auto ref_nm = NodeExtentManager::create_dummy(false);
       pool_clone.p_nm = ref_nm.get();
       pool_clone.p_btree.emplace(std::move(ref_nm));
       pool_clone.p_btree->test_clone_from(
@@ -1230,7 +1230,7 @@ struct d_seastore_tree_test_t : public seastar_test_suite_t {
       tm(*segment_manager, segment_cleaner, journal, cache, *lba_manager),
       moved_nm{
 #if 0
-        NodeExtentManager::create_dummy()},
+        NodeExtentManager::create_dummy(false)},
 #else
         NodeExtentManager::create_seastore(tm)},
 #endif