]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore: introduce src_t to classify transactions
authorYingxin Cheng <yingxin.cheng@intel.com>
Wed, 7 Jul 2021 01:37:24 +0000 (09:37 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Wed, 14 Jul 2021 02:51:43 +0000 (10:51 +0800)
* INIT - READ            => INIT
* INIT - MUTATE          => INIT
* SEASTORE/TEST - READ   => READ
* SEASTORE/TEST - MUTATE => MUTATE
* CLEANER - READ         => CLEANER
* CLEANER - MUTATE       => CLEANER

Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
20 files changed:
src/crimson/os/seastore/cache.h
src/crimson/os/seastore/seastore.cc
src/crimson/os/seastore/seastore.h
src/crimson/os/seastore/segment_cleaner.cc
src/crimson/os/seastore/segment_cleaner.h
src/crimson/os/seastore/transaction.h
src/crimson/os/seastore/transaction_manager.cc
src/crimson/os/seastore/transaction_manager.h
src/crimson/tools/store_nbd/tm_driver.cc
src/test/crimson/seastore/onode_tree/test_fltree_onode_manager.cc
src/test/crimson/seastore/onode_tree/test_staged_fltree.cc
src/test/crimson/seastore/test_btree_lba_manager.cc
src/test/crimson/seastore/test_collection_manager.cc
src/test/crimson/seastore/test_object_data_handler.cc
src/test/crimson/seastore/test_omap_manager.cc
src/test/crimson/seastore/test_randomblock_manager.cc
src/test/crimson/seastore/test_seastore_cache.cc
src/test/crimson/seastore/test_transaction_manager.cc
src/test/crimson/seastore/transaction_manager_test_state.h
src/tools/crimson/perf_staged_fltree.cc

index d8470838b41a551387720f683718037eeea1fdac..b6b0714e8905114d47673e87fa6421730ffbfeb9 100644 (file)
@@ -94,29 +94,33 @@ public:
 
   retired_extent_gate_t retired_extent_gate;
 
-  /// Creates empty transaction
-  TransactionRef create_transaction() {
+  /// Creates empty transaction by source
+  TransactionRef create_transaction(
+      Transaction::src_t src) {
     LOG_PREFIX(Cache::create_transaction);
     auto ret = std::make_unique<Transaction>(
       get_dummy_ordering_handle(),
       false,
+      src,
       last_commit
     );
     retired_extent_gate.add_token(ret->retired_gate_token);
-    DEBUGT("created", *ret);
+    DEBUGT("created source={}", *ret, src);
     return ret;
   }
 
-  /// Creates empty weak transaction
-  TransactionRef create_weak_transaction() {
+  /// Creates empty weak transaction by source
+  TransactionRef create_weak_transaction(
+      Transaction::src_t src) {
     LOG_PREFIX(Cache::create_weak_transaction);
     auto ret = std::make_unique<Transaction>(
       get_dummy_ordering_handle(),
       true,
+      src,
       last_commit
     );
     retired_extent_gate.add_token(ret->retired_gate_token);
-    DEBUGT("created", *ret);
+    DEBUGT("created source={}", *ret, src);
     return ret;
   }
 
index 3cee74a7cc658ff9993e721edb37c1b504270d98..13a32dea08e0739af6befd279918fde720e95f30 100644 (file)
@@ -83,7 +83,8 @@ seastar::future<> SeaStore::mkfs(uuid_d new_osd_fsid)
     return transaction_manager->mount();
   }).safe_then([this] {
     return seastar::do_with(
-      transaction_manager->create_transaction(),
+      transaction_manager->create_transaction(
+        Transaction::src_t::MUTATE),
       [this](auto &t) {
        return onode_manager->mkfs(*t
        ).safe_then([this, &t] {
@@ -130,7 +131,8 @@ SeaStore::list_objects(CollectionRef ch,
       [this, start, end, limit] (auto& ret) {
     return repeat_eagain2([this, start, end, limit, &ret] {
       return seastar::do_with(
-          transaction_manager->create_transaction(),
+          transaction_manager->create_transaction(
+            Transaction::src_t::READ),
           [this, start, end, limit, &ret] (auto& t) {
         return onode_manager->list_onodes(*t, start, end, limit
         ).safe_then([&ret] (auto&& _ret) {
@@ -172,7 +174,8 @@ seastar::future<std::vector<coll_t>> SeaStore::list_collections()
       return repeat_eagain([this, &ret] {
 
        return seastar::do_with(
-         transaction_manager->create_transaction(),
+         transaction_manager->create_transaction(
+            Transaction::src_t::READ),
          [this, &ret](auto &t) {
            return transaction_manager->read_collection_root(*t
            ).safe_then([this, &t](auto coll_root) {
@@ -212,6 +215,7 @@ SeaStore::read_errorator::future<ceph::bufferlist> SeaStore::read(
   return repeat_with_onode<ceph::bufferlist>(
     ch,
     oid,
+    Transaction::src_t::READ,
     [=](auto &t, auto &onode) -> ObjectDataHandler::read_ret {
       size_t size = onode.get_layout().size;
 
@@ -254,24 +258,27 @@ SeaStore::get_attr_errorator::future<ceph::bufferlist> SeaStore::get_attr(
   LOG_PREFIX(SeaStore::get_attr);
   DEBUG("{} {}", c->get_cid(), oid);
   return repeat_with_onode<ceph::bufferlist>(
-    c, oid, [=](auto &t, auto& onode)
-    -> _omap_get_value_ertr::future<ceph::bufferlist> {
-    auto& layout = onode.get_layout();
-    if (name == OI_ATTR && layout.oi_size) {
-      ceph::bufferlist bl;
-      bl.append(ceph::bufferptr(&layout.oi[0], layout.oi_size));
-      return seastar::make_ready_future<ceph::bufferlist>(std::move(bl));
-    }
-    if (name == SS_ATTR && layout.ss_size) {
-      ceph::bufferlist bl;
-      bl.append(ceph::bufferptr(&layout.ss[0], layout.ss_size));
-      return seastar::make_ready_future<ceph::bufferlist>(std::move(bl));
+    c,
+    oid,
+    Transaction::src_t::READ,
+    [=](auto &t, auto& onode) -> _omap_get_value_ertr::future<ceph::bufferlist> {
+      auto& layout = onode.get_layout();
+      if (name == OI_ATTR && layout.oi_size) {
+        ceph::bufferlist bl;
+        bl.append(ceph::bufferptr(&layout.oi[0], layout.oi_size));
+        return seastar::make_ready_future<ceph::bufferlist>(std::move(bl));
+      }
+      if (name == SS_ATTR && layout.ss_size) {
+        ceph::bufferlist bl;
+        bl.append(ceph::bufferptr(&layout.ss[0], layout.ss_size));
+        return seastar::make_ready_future<ceph::bufferlist>(std::move(bl));
+      }
+      return _omap_get_value(
+        t,
+        layout.xattr_root.get(),
+        name);
     }
-    return _omap_get_value(
-      t,
-      layout.xattr_root.get(),
-      name);
-  }).handle_error(crimson::ct_error::input_output_error::handle([FNAME] {
+  ).handle_error(crimson::ct_error::input_output_error::handle([FNAME] {
     ERROR("EIO when getting attrs");
     abort();
   }), crimson::ct_error::pass_further_all{});
@@ -285,25 +292,29 @@ SeaStore::get_attrs_ertr::future<SeaStore::attrs_t> SeaStore::get_attrs(
   auto c = static_cast<SeastoreCollection*>(ch.get());
   DEBUG("{} {}", c->get_cid(), oid);
   return repeat_with_onode<attrs_t>(
-    c, oid, [=](auto &t, auto& onode) {
-    auto& layout = onode.get_layout();
-    return _omap_list(layout.xattr_root, t, std::nullopt,
-      OMapManager::omap_list_config_t::with_inclusive(false)
-    ).safe_then([&layout](auto p) {
-      auto& attrs = std::get<1>(p);
-      ceph::bufferlist bl;
-      if (layout.oi_size) {
-        bl.append(ceph::bufferptr(&layout.oi[0], layout.oi_size));
-        attrs.emplace(OI_ATTR, std::move(bl));
-      }
-      if (layout.ss_size) {
-        bl.clear();
-        bl.append(ceph::bufferptr(&layout.ss[0], layout.ss_size));
-        attrs.emplace(SS_ATTR, std::move(bl));
-      }
-      return seastar::make_ready_future<omap_values_t>(std::move(attrs));
-    });
-  }).handle_error(crimson::ct_error::input_output_error::handle([FNAME] {
+    c,
+    oid,
+    Transaction::src_t::READ,
+    [=](auto &t, auto& onode) {
+      auto& layout = onode.get_layout();
+      return _omap_list(layout.xattr_root, t, std::nullopt,
+        OMapManager::omap_list_config_t::with_inclusive(false)
+      ).safe_then([&layout](auto p) {
+        auto& attrs = std::get<1>(p);
+        ceph::bufferlist bl;
+        if (layout.oi_size) {
+          bl.append(ceph::bufferptr(&layout.oi[0], layout.oi_size));
+          attrs.emplace(OI_ATTR, std::move(bl));
+        }
+        if (layout.ss_size) {
+          bl.clear();
+          bl.append(ceph::bufferptr(&layout.ss[0], layout.ss_size));
+          attrs.emplace(SS_ATTR, std::move(bl));
+        }
+        return seastar::make_ready_future<omap_values_t>(std::move(attrs));
+      });
+    }
+  ).handle_error(crimson::ct_error::input_output_error::handle([FNAME] {
     ERROR("EIO when getting attrs");
     abort();
   }), crimson::ct_error::pass_further_all{});
@@ -317,6 +328,7 @@ seastar::future<struct stat> SeaStore::stat(
   return repeat_with_onode<struct stat>(
     c,
     oid,
+    Transaction::src_t::READ,
     [=, &oid](auto &t, auto &onode) {
       struct stat st;
       auto &olayout = onode.get_layout();
@@ -326,11 +338,12 @@ seastar::future<struct stat> SeaStore::stat(
       st.st_nlink = 1;
       DEBUGT("cid {}, oid {}, return size {}", t, c->get_cid(), oid, st.st_size);
       return seastar::make_ready_future<struct stat>(st);
-    }).handle_error(
-      crimson::ct_error::assert_all{
-       "Invalid error in SeaStore::stat"
-       }
-    );
+    }
+  ).handle_error(
+    crimson::ct_error::assert_all{
+      "Invalid error in SeaStore::stat"
+    }
+  );
 }
 
 auto
@@ -352,6 +365,7 @@ SeaStore::omap_get_values(
   return repeat_with_onode<omap_values_t>(
     c,
     oid,
+    Transaction::src_t::READ,
     [this, keys](auto &t, auto &onode) {
       omap_root_t omap_root = onode.get_layout().omap_root.get();
       return _omap_get_values(
@@ -468,6 +482,7 @@ SeaStore::omap_get_values_ret_t SeaStore::omap_list(
   return repeat_with_onode<ret_bare_t>(
     c,
     oid,
+    Transaction::src_t::READ,
     [this, config, &start](auto &t, auto &onode) {
       return _omap_list(
        onode.get_layout().omap_root,
@@ -617,6 +632,7 @@ seastar::future<> SeaStore::do_transaction(
   return repeat_with_internal_context(
     _ch,
     std::move(_t),
+    Transaction::src_t::MUTATE,
     [this](auto &ctx) {
       return onode_manager->get_or_create_onodes(
        *ctx.transaction, ctx.iter.get_objects()
@@ -1082,7 +1098,8 @@ seastar::future<> SeaStore::write_meta(const std::string& key,
     value,
     [this, FNAME](auto &t, auto& key, auto& value) {
       return repeat_eagain([this, FNAME, &t, &key, &value] {
-       t = transaction_manager->create_transaction();
+       t = transaction_manager->create_transaction(
+            Transaction::src_t::MUTATE);
        DEBUGT("Have transaction, key: {}; value: {}", *t, key, value);
         return transaction_manager->update_root_meta(
          *t, key, value
@@ -1105,7 +1122,8 @@ seastar::future<std::tuple<int, std::string>> SeaStore::read_meta(const std::str
     key,
     [this](auto &ret, auto &t, auto& key) {
       return repeat_eagain([this, &ret, &t, &key] {
-       t = transaction_manager->create_transaction();
+       t = transaction_manager->create_transaction(
+            Transaction::src_t::READ);
        return transaction_manager->read_root_meta(
          *t, key
        ).safe_then([&ret](auto v) {
index adc67676d4e58d71a8c206a1280d7ac2310126b2..c7583ee05779702f8d8f80f0bb831a33e685e550 100644 (file)
@@ -161,11 +161,12 @@ private:
   auto repeat_with_internal_context(
     CollectionRef ch,
     ceph::os::Transaction &&t,
+    Transaction::src_t src,
     F &&f) {
     return seastar::do_with(
       internal_context_t(
        ch, std::move(t),
-       transaction_manager->create_transaction()),
+       transaction_manager->create_transaction(src)),
       std::forward<F>(f),
       [this](auto &ctx, auto &f) {
        return ctx.transaction->get_handle().take_collection_lock(
@@ -188,6 +189,7 @@ private:
   auto repeat_with_onode(
     CollectionRef ch,
     const ghobject_t &oid,
+    Transaction::src_t src,
     F &&f) const {
     return seastar::do_with(
       oid,
@@ -196,8 +198,8 @@ private:
       OnodeRef(),
       std::forward<F>(f),
       [=](auto &oid, auto &ret, auto &t, auto &onode, auto &f) {
-       return repeat_eagain([&, this] {
-         t = transaction_manager->create_transaction();
+       return repeat_eagain([&, this, src] {
+         t = transaction_manager->create_transaction(src);
          return onode_manager->get_onode(
            *t, oid
          ).safe_then([&](auto onode_ret) {
index 3ad49b80918acb47fd407f0c78dadd20c258c852..41ac9e86aba00b582dc40ce1e1805d597be5adf9 100644 (file)
@@ -284,7 +284,7 @@ SegmentCleaner::gc_trim_journal_ret SegmentCleaner::gc_trim_journal()
   return repeat_eagain(
     [this] {
       return seastar::do_with(
-       ecb->create_transaction(),
+       ecb->create_transaction(Transaction::src_t::CLEANER),
        [this](auto &tref) {
          return with_trans_intr(*tref, [this](auto &t) {
            return rewrite_dirty(t, get_dirty_tail()
@@ -330,7 +330,7 @@ SegmentCleaner::gc_reclaim_space_ret SegmentCleaner::gc_reclaim_space()
            "SegmentCleaner::gc_reclaim_space: processing {} extents",
            extents.size());
          return seastar::do_with(
-           ecb->create_transaction(),
+           ecb->create_transaction(Transaction::src_t::CLEANER),
            [this, &extents](auto &tref) mutable {
              return with_trans_intr(*tref, [this, &extents](auto &t) {
                return trans_intr::do_for_each(
index 256225d7f5400cb3762ec8ebf03d8dd860df1cd6..b656abb594948bb11b37161bf26aa53f3333d2e2 100644 (file)
@@ -246,7 +246,7 @@ public:
   public:
     virtual ~ExtentCallbackInterface() = default;
 
-    virtual TransactionRef create_transaction() = 0;
+    virtual TransactionRef create_transaction(Transaction::src_t) = 0;
 
     /**
      * get_next_dirty_extent
index b8376d7e6d2748f0eda09949a345100a5c70cceb..e8832ffc96e5d3771d90cd442bbf346033953ae8 100644 (file)
@@ -141,6 +141,20 @@ public:
     return retired_set;
   }
 
+  enum class src_t : uint8_t {
+    // normal IO operations at seastore boundary or within a test
+    MUTATE = 0,
+    READ,
+    // transaction manager level operations
+    INIT,
+    CLEANER,
+    MAX
+  };
+  static constexpr auto SRC_MAX = static_cast<std::size_t>(src_t::MAX);
+  src_t get_src() const {
+    return src;
+  }
+
   bool is_weak() const {
     return weak;
   }
@@ -156,10 +170,12 @@ public:
   Transaction(
     OrderingHandle &&handle,
     bool weak,
+    src_t src,
     journal_seq_t initiated_after
   ) : weak(weak),
       retired_gate_token(initiated_after),
-      handle(std::move(handle))
+      handle(std::move(handle)),
+      src(src)
   {}
 
 
@@ -217,14 +233,33 @@ private:
   bool conflicted = false;
 
   OrderingHandle handle;
+
+  const src_t src;
 };
 using TransactionRef = Transaction::Ref;
 
+inline std::ostream& operator<<(std::ostream& os,
+                                const Transaction::src_t& src) {
+  switch (src) {
+  case Transaction::src_t::MUTATE:
+    return os << "MUTATE";
+  case Transaction::src_t::READ:
+    return os << "READ";
+  case Transaction::src_t::INIT:
+    return os << "INIT";
+  case Transaction::src_t::CLEANER:
+    return os << "CLEANER";
+  default:
+    ceph_abort("impossible");
+  }
+}
+
 /// Should only be used with dummy staged-fltree node extent manager
 inline TransactionRef make_test_transaction() {
   return std::make_unique<Transaction>(
     get_dummy_ordering_handle(),
     false,
+    Transaction::src_t::MUTATE,
     journal_seq_t{}
   );
 }
index 3f00917e071624458436fa7acfebe30ae4b8b502..f77fc76188579a0fae1f9cd1777572b451fec9db 100644 (file)
@@ -36,7 +36,7 @@ TransactionManager::mkfs_ertr::future<> TransactionManager::mkfs()
     DEBUG("about to do_with");
     segment_cleaner->init_mkfs(addr);
     return seastar::do_with(
-      create_transaction(),
+      create_transaction(Transaction::src_t::INIT),
       [this, FNAME](auto &transaction) {
        DEBUGT(
          "about to cache->mkfs",
@@ -78,7 +78,7 @@ TransactionManager::mount_ertr::future<> TransactionManager::mount()
   }).safe_then([this, FNAME](auto addr) {
     segment_cleaner->set_journal_head(addr);
     return seastar::do_with(
-      create_weak_transaction(),
+      create_weak_transaction(Transaction::src_t::INIT),
       [this, FNAME](auto &tref) {
        return with_trans_intr(
          *tref,
index 9bc75135e15e2cd00fdafaa8aea9ee0af525d478..5755ac3fdd10fcc2ed91befbc650ff170d24390e 100644 (file)
@@ -107,13 +107,15 @@ public:
   close_ertr::future<> close();
 
   /// Creates empty transaction
-  TransactionRef create_transaction() final {
-    return cache->create_transaction();
+  TransactionRef create_transaction(
+      Transaction::src_t src) final {
+    return cache->create_transaction(src);
   }
 
   /// Creates empty weak transaction
-  TransactionRef create_weak_transaction() {
-    return cache->create_weak_transaction();
+  TransactionRef create_weak_transaction(
+      Transaction::src_t src) {
+    return cache->create_weak_transaction(src);
   }
 
   /// Resets transaction
index 64271bc0ee204d15e4d9dca868737ccee2cea4a9..7a02b9a0b20ec5664eed1f457dbb4869bd782c78 100644 (file)
@@ -23,7 +23,7 @@ seastar::future<> TMDriver::write(
   assert((ptr.length() % (size_t)segment_manager->get_block_size()) == 0);
   return repeat_eagain([this, offset, ptr=std::move(ptr)] {
     return seastar::do_with(
-      tm->create_transaction(),
+      tm->create_transaction(Transaction::src_t::MUTATE),
       ptr,
       [this, offset](auto &t, auto &ptr) mutable {
        return tm->dec_ref(
@@ -101,7 +101,7 @@ seastar::future<bufferlist> TMDriver::read(
   auto &blret = *blptrret;
   return repeat_eagain([=, &blret] {
     return seastar::do_with(
-      tm->create_transaction(),
+      tm->create_transaction(Transaction::src_t::READ),
       [=, &blret](auto &t) {
        return read_extents(*t, offset, size
        ).safe_then([=, &blret](auto ext_list) mutable {
index bdbdd3d1845009c34d648dab87ca96b0376e36db..9804c9746d92be9e059d8866cf568c61afa22d70 100644 (file)
@@ -85,7 +85,7 @@ struct fltree_onode_manager_test_t
       return tm->mount(
       ).safe_then([this] {
        return seastar::do_with(
-         tm->create_transaction(),
+         create_mutate_transaction(),
          [this](auto &t) {
            return manager->mkfs(*t
            ).safe_then([this, &t] {
@@ -102,7 +102,7 @@ struct fltree_onode_manager_test_t
 
   template <typename F>
   void with_transaction(F&& f) {
-    auto t = tm->create_transaction();
+    auto t = create_mutate_transaction();
     std::invoke(f, *t);
     submit_transaction(std::move(t));
     segment_cleaner->run_until_halt().get0();
index 79ce42aed768714cba57cefccf533a59ac38a8af..e77df0c6b2b7685cedd20eb8a7d439dc36a88906 100644 (file)
@@ -1534,7 +1534,7 @@ TEST_F(d_seastore_tm_test_t, 6_random_tree_insert_erase)
     auto tree = std::make_unique<TreeBuilder<TRACK_CURSORS, BoundedValue>>(
         kvs, std::move(moved_nm));
     {
-      auto t = tm->create_transaction();
+      auto t = create_mutate_transaction();
       tree->bootstrap(*t).unsafe_get();
       submit_transaction(std::move(t));
       segment_cleaner->run_until_halt().get0();
@@ -1542,13 +1542,13 @@ TEST_F(d_seastore_tm_test_t, 6_random_tree_insert_erase)
 
     // test insert
     {
-      auto t = tm->create_transaction();
+      auto t = create_mutate_transaction();
       tree->insert(*t).unsafe_get();
       submit_transaction(std::move(t));
       segment_cleaner->run_until_halt().get0();
     }
     {
-      auto t = tm->create_transaction();
+      auto t = create_read_transaction();
       tree->get_stats(*t).unsafe_get();
     }
     if constexpr (TEST_SEASTORE) {
@@ -1558,20 +1558,20 @@ TEST_F(d_seastore_tm_test_t, 6_random_tree_insert_erase)
       logger().info("seastore replay insert end");
     }
     {
-      // Note: tm->create_weak_transaction() can also work, but too slow.
-      auto t = tm->create_transaction();
+      // Note: create_weak_transaction() can also work, but too slow.
+      auto t = create_read_transaction();
       tree->validate(*t).unsafe_get();
     }
 
     // test erase 3/4
     {
-      auto t = tm->create_transaction();
+      auto t = create_mutate_transaction();
       tree->erase(*t, kvs.size() / 4 * 3).unsafe_get();
       submit_transaction(std::move(t));
       segment_cleaner->run_until_halt().get0();
     }
     {
-      auto t = tm->create_transaction();
+      auto t = create_read_transaction();
       tree->get_stats(*t).unsafe_get();
     }
     if constexpr (TEST_SEASTORE) {
@@ -1581,19 +1581,19 @@ TEST_F(d_seastore_tm_test_t, 6_random_tree_insert_erase)
       logger().info("seastore replay erase-1 end");
     }
     {
-      auto t = tm->create_transaction();
+      auto t = create_read_transaction();
       tree->validate(*t).unsafe_get();
     }
 
     // test erase remaining
     {
-      auto t = tm->create_transaction();
+      auto t = create_mutate_transaction();
       tree->erase(*t, kvs.size()).unsafe_get();
       submit_transaction(std::move(t));
       segment_cleaner->run_until_halt().get0();
     }
     {
-      auto t = tm->create_transaction();
+      auto t = create_read_transaction();
       tree->get_stats(*t).unsafe_get();
     }
     if constexpr (TEST_SEASTORE) {
@@ -1603,7 +1603,7 @@ TEST_F(d_seastore_tm_test_t, 6_random_tree_insert_erase)
       logger().info("seastore replay erase-2 end");
     }
     {
-      auto t = tm->create_transaction();
+      auto t = create_read_transaction();
       tree->validate(*t).unsafe_get();
       EXPECT_EQ(tree->height(*t).unsafe_get0(), 1);
     }
@@ -1639,7 +1639,7 @@ TEST_F(d_seastore_tm_test_t, 7_tree_insert_erase_eagain)
     repeat_eagain([this, &tree, &num_ops_eagain] {
       ++num_ops_eagain;
       return seastar::do_with(
-       tm->create_transaction(),
+       create_mutate_transaction(),
        [this, &tree](auto &t) {
          return tree->bootstrap(*t
          ).safe_then([this, &t] {
@@ -1658,7 +1658,7 @@ TEST_F(d_seastore_tm_test_t, 7_tree_insert_erase_eagain)
         repeat_eagain([this, &tree, &num_ops_eagain, &iter] {
           ++num_ops_eagain;
          return seastar::do_with(
-           tm->create_transaction(),
+           create_mutate_transaction(),
            [this, &tree, &iter](auto &t) {
              return tree->insert_one(*t, iter
              ).safe_then([this, &t](auto cursor) {
@@ -1674,7 +1674,7 @@ TEST_F(d_seastore_tm_test_t, 7_tree_insert_erase_eagain)
 
     {
       p_nm->set_generate_eagain(false);
-      auto t = tm->create_transaction();
+      auto t = create_read_transaction();
       tree->get_stats(*t).unsafe_get0();
       p_nm->set_generate_eagain(true);
     }
@@ -1687,7 +1687,7 @@ TEST_F(d_seastore_tm_test_t, 7_tree_insert_erase_eagain)
         ++num_ops;
         repeat_eagain2([this, &tree, &num_ops_eagain, &iter] {
           ++num_ops_eagain;
-          auto t = tm->create_transaction();
+          auto t = create_read_transaction();
           return tree->validate_one(*t, iter
           ).safe_then([t=std::move(t)]{});
         }).get0();
@@ -1705,7 +1705,7 @@ TEST_F(d_seastore_tm_test_t, 7_tree_insert_erase_eagain)
         repeat_eagain([this, &tree, &num_ops_eagain, &iter] {
           ++num_ops_eagain;
          return seastar::do_with(
-           tm->create_transaction(),
+           create_mutate_transaction(),
            [this, &tree, &iter](auto &t) {
              return tree->erase_one(*t, iter
              ).safe_then([this, &t] () mutable {
@@ -1721,7 +1721,7 @@ TEST_F(d_seastore_tm_test_t, 7_tree_insert_erase_eagain)
 
     {
       p_nm->set_generate_eagain(false);
-      auto t = tm->create_transaction();
+      auto t = create_read_transaction();
       tree->get_stats(*t).unsafe_get0();
       tree->validate(*t).unsafe_get0();
       EXPECT_EQ(tree->height(*t).unsafe_get0(), 1);
index 596e8362f6bb96082c5369326c2ce6311c120df9..57f575c17227cb8877eae874ea86be3e7ab64c4e 100644 (file)
@@ -73,7 +73,7 @@ struct btree_lba_manager_test :
       return journal.open_for_write();
     }).safe_then([this](auto addr) {
       return seastar::do_with(
-       cache.create_transaction(),
+       cache.create_transaction(Transaction::src_t::MUTATE),
        [this](auto &transaction) {
          cache.init();
          return cache.mkfs(*transaction
@@ -116,7 +116,7 @@ struct btree_lba_manager_test :
 
   auto create_transaction() {
     auto t = test_transaction_t{
-      cache.create_transaction(),
+      cache.create_transaction(Transaction::src_t::MUTATE),
       test_lba_mappings
     };
     cache.alloc_new_extent<TestBlockPhysical>(*t.t, TestBlockPhysical::SIZE);
@@ -125,7 +125,7 @@ struct btree_lba_manager_test :
 
   auto create_weak_transaction() {
     auto t = test_transaction_t{
-      cache.create_weak_transaction(),
+      cache.create_weak_transaction(Transaction::src_t::READ),
       test_lba_mappings
     };
     return t;
index a2ccdf2063f370ed1e8d4358a1838481bd89ed7c..e15602c218dc9f8cba9c50cd0c0741e031b6b6c3 100644 (file)
@@ -71,7 +71,7 @@ struct collection_manager_test_t :
   }
 
   auto get_root() {
-    auto tref = tm->create_transaction();
+    auto tref = create_mutate_transaction();
     auto coll_root = with_trans_intr(
       *tref,
       [this](auto &t) {
@@ -97,7 +97,7 @@ struct collection_manager_test_t :
   }
 
   void checking_mappings(coll_root_t &coll_root) {
-    auto t = tm->create_transaction();
+    auto t = create_read_transaction();
     checking_mappings(coll_root, *t);
   }
 };
@@ -107,7 +107,7 @@ TEST_F(collection_manager_test_t, basic)
   run_async([this] {
     coll_root_t coll_root = get_root();
     {
-      auto t = tm->create_transaction();
+      auto t = create_mutate_transaction();
       for (int i = 0; i < 20; i++) {
         coll_t cid(spg_t(pg_t(i+1,i+2), shard_id_t::NO_SHARD));
         create(coll_root, *t, cid, coll_info_t(i));
@@ -121,7 +121,7 @@ TEST_F(collection_manager_test_t, basic)
     replay();
     checking_mappings(coll_root);
     {
-      auto t = tm->create_transaction();
+      auto t = create_mutate_transaction();
       for (auto iter = test_coll_mappings.begin();
            iter != test_coll_mappings.end();) {
         remove(coll_root, *t, iter->first);
@@ -131,7 +131,7 @@ TEST_F(collection_manager_test_t, basic)
     }
     replay();
     {
-      auto t = tm->create_transaction();
+      auto t = create_mutate_transaction();
       auto list_ret = list(coll_root, *t);
       submit_transaction(std::move(t));
       EXPECT_EQ(list_ret.size(), test_coll_mappings.size());
@@ -145,7 +145,7 @@ TEST_F(collection_manager_test_t, overflow)
     coll_root_t coll_root = get_root();
     auto old_location = coll_root.get_location();
 
-    auto t = tm->create_transaction();
+    auto t = create_mutate_transaction();
     for (int i = 0; i < 412; i++) {
       coll_t cid(spg_t(pg_t(i+1,i+2), shard_id_t::NO_SHARD));
       create(coll_root, *t, cid, coll_info_t(i));
@@ -165,7 +165,7 @@ TEST_F(collection_manager_test_t, update)
   run_async([this] {
     coll_root_t coll_root = get_root();
     {
-      auto t = tm->create_transaction();
+      auto t = create_mutate_transaction();
       for (int i = 0; i < 2; i++) {
         coll_t cid(spg_t(pg_t(1,i+1), shard_id_t::NO_SHARD));
        create(coll_root, *t, cid, coll_info_t(i));
@@ -177,7 +177,7 @@ TEST_F(collection_manager_test_t, update)
        auto iter1= test_coll_mappings.begin();
        auto iter2 = std::next(test_coll_mappings.begin(), 1);
        EXPECT_NE(iter1->second.split_bits, iter2->second.split_bits);
-       auto t = tm->create_transaction();
+       auto t = create_mutate_transaction();
        update(coll_root, *t, iter1->first, iter2->second);
        submit_transaction(std::move(t));
        iter1->second.split_bits = iter2->second.split_bits;
index 95770a3c5c2cff9b876daca7dd7f01e11189bc10..972598aa968f55e4bad7c526bbbe73c37b9eae07 100644 (file)
@@ -66,7 +66,7 @@ struct object_data_handler_test_t:
       bl).unsafe_get0();
   }
   void write(objaddr_t offset, extent_len_t len, char fill) {
-    auto t = tm->create_transaction();
+    auto t = create_mutate_transaction();
     write(*t, offset, len, fill);
     return submit_transaction(std::move(t));
   }
@@ -88,7 +88,7 @@ struct object_data_handler_test_t:
     size = offset;
   }
   void truncate(objaddr_t offset) {
-    auto t = tm->create_transaction();
+    auto t = create_mutate_transaction();
     truncate(*t, offset);
     return submit_transaction(std::move(t));
   }
@@ -112,7 +112,7 @@ struct object_data_handler_test_t:
     EXPECT_EQ(bl, known);
   }
   void read(objaddr_t offset, extent_len_t len) {
-    auto t = tm->create_transaction();
+    auto t = create_read_transaction();
     read(*t, offset, len);
   }
   void read_near(objaddr_t offset, extent_len_t len, extent_len_t fuzz) {
index 18889e71ccd49c9f316c8c683b5b0d0621f2adef..47641039bc0d74a1577f9b66be1160b9def176a1 100644 (file)
@@ -194,7 +194,7 @@ struct omap_manager_test_t :
   }
 
   void check_mappings(omap_root_t &omap_root) {
-    auto t = tm->create_transaction();
+    auto t = create_read_transaction();
     check_mappings(omap_root, *t);
   }
 
@@ -215,7 +215,7 @@ struct omap_manager_test_t :
   }
 
   auto initialize() {
-    auto t = tm->create_transaction();
+    auto t = create_mutate_transaction();
     omap_root_t omap_root = with_trans_intr(
       *t,
       [this](auto &t) {
@@ -235,14 +235,14 @@ TEST_F(omap_manager_test_t, basic)
     string val = "test";
 
     {
-      auto t = tm->create_transaction();
+      auto t = create_mutate_transaction();
       logger().debug("first transaction");
       set_key(omap_root, *t, key, val);
       get_value(omap_root, *t, key);
       submit_transaction(std::move(t));
     }
     {
-      auto t = tm->create_transaction();
+      auto t = create_mutate_transaction();
       logger().debug("second transaction");
       get_value(omap_root, *t, key);
       rm_key(omap_root, *t, key);
@@ -250,7 +250,7 @@ TEST_F(omap_manager_test_t, basic)
       submit_transaction(std::move(t));
     }
     {
-      auto t = tm->create_transaction();
+      auto t = create_mutate_transaction();
       logger().debug("third transaction");
       get_value(omap_root, *t, key);
       submit_transaction(std::move(t));
@@ -264,7 +264,7 @@ TEST_F(omap_manager_test_t, force_leafnode_split)
     omap_root_t omap_root = initialize();
 
     for (unsigned i = 0; i < 40; i++) {
-      auto t = tm->create_transaction();
+      auto t = create_mutate_transaction();
       logger().debug("opened transaction");
       for (unsigned j = 0; j < 10; ++j) {
         set_random_key(omap_root, *t);
@@ -285,7 +285,7 @@ TEST_F(omap_manager_test_t, force_leafnode_split_merge)
     omap_root_t omap_root = initialize();
 
     for (unsigned i = 0; i < 80; i++) {
-      auto t = tm->create_transaction();
+      auto t = create_mutate_transaction();
       logger().debug("opened split_merge transaction");
       for (unsigned j = 0; j < 5; ++j) {
         set_random_key(omap_root, *t);
@@ -300,7 +300,7 @@ TEST_F(omap_manager_test_t, force_leafnode_split_merge)
       }
     }
     auto mkeys = get_mapped_keys();
-    auto t = tm->create_transaction();
+    auto t = create_mutate_transaction();
     for (unsigned i = 0; i < mkeys.size(); i++) {
       if (i % 3 != 0) {
         rm_key(omap_root, *t, mkeys[i]);
@@ -309,7 +309,7 @@ TEST_F(omap_manager_test_t, force_leafnode_split_merge)
       if (i % 10 == 0) {
         logger().debug("submitting transaction i= {}", i);
         submit_transaction(std::move(t));
-        t = tm->create_transaction();
+        t = create_mutate_transaction();
       }
       if (i % 100 == 0) {
         logger().debug("check_mappings  i= {}", i);
@@ -328,7 +328,7 @@ TEST_F(omap_manager_test_t, force_leafnode_split_merge_fullandbalanced)
     omap_root_t omap_root = initialize();
 
     for (unsigned i = 0; i < 50; i++) {
-      auto t = tm->create_transaction();
+      auto t = create_mutate_transaction();
       logger().debug("opened split_merge transaction");
       for (unsigned j = 0; j < 5; ++j) {
         set_random_key(omap_root, *t);
@@ -343,7 +343,7 @@ TEST_F(omap_manager_test_t, force_leafnode_split_merge_fullandbalanced)
       }
     }
     auto mkeys = get_mapped_keys();
-    auto t = tm->create_transaction();
+    auto t = create_mutate_transaction();
     for (unsigned i = 0; i < mkeys.size(); i++) {
       if (30 < i && i < 100) {
         rm_key(omap_root, *t, mkeys[i]);
@@ -352,7 +352,7 @@ TEST_F(omap_manager_test_t, force_leafnode_split_merge_fullandbalanced)
       if (i % 10 == 0) {
         logger().debug("submitting transaction i= {}", i);
         submit_transaction(std::move(t));
-        t = tm->create_transaction();
+        t = create_mutate_transaction();
       }
       if (i % 50 == 0) {
         logger().debug("check_mappings  i= {}", i);
@@ -375,7 +375,7 @@ TEST_F(omap_manager_test_t, force_split_listkeys_list_clear)
 
     string temp;
     for (unsigned i = 0; i < 40; i++) {
-      auto t = tm->create_transaction();
+      auto t = create_mutate_transaction();
       logger().debug("opened transaction");
       for (unsigned j = 0; j < 10; ++j) {
         auto key = set_random_key(omap_root, *t);
@@ -391,17 +391,17 @@ TEST_F(omap_manager_test_t, force_split_listkeys_list_clear)
     }
 
     {
-      auto t = tm->create_transaction();
+      auto t = create_read_transaction();
       list(omap_root, *t, std::nullopt);
     }
 
     {
-      auto t = tm->create_transaction();
+      auto t = create_read_transaction();
       list(omap_root, *t, temp, 100);
     }
 
     {
-      auto t = tm->create_transaction();
+      auto t = create_mutate_transaction();
       clear(omap_root, *t);
       submit_transaction(std::move(t));
     }
@@ -415,7 +415,7 @@ TEST_F(omap_manager_test_t, internal_force_split)
 
     for (unsigned i = 0; i < 10; i++) {
       logger().debug("opened split transaction");
-      auto t = tm->create_transaction();
+      auto t = create_mutate_transaction();
 
       for (unsigned j = 0; j < 80; ++j) {
         set_random_key(omap_root, *t);
@@ -437,7 +437,7 @@ TEST_F(omap_manager_test_t, internal_force_merge_fullandbalanced)
 
     for (unsigned i = 0; i < 8; i++) {
       logger().debug("opened split transaction");
-      auto t = tm->create_transaction();
+      auto t = create_mutate_transaction();
 
       for (unsigned j = 0; j < 80; ++j) {
         set_random_key(omap_root, *t);
@@ -449,14 +449,14 @@ TEST_F(omap_manager_test_t, internal_force_merge_fullandbalanced)
       submit_transaction(std::move(t));
     }
     auto mkeys = get_mapped_keys();
-    auto t = tm->create_transaction();
+    auto t = create_mutate_transaction();
     for (unsigned i = 0; i < mkeys.size(); i++) {
       rm_key(omap_root, *t, mkeys[i]);
 
       if (i % 10 == 0) {
         logger().debug("submitting transaction i= {}", i);
         submit_transaction(std::move(t));
-        t = tm->create_transaction();
+        t = create_mutate_transaction();
       }
       if (i % 50 == 0) {
         logger().debug("check_mappings  i= {}", i);
@@ -477,7 +477,7 @@ TEST_F(omap_manager_test_t, replay)
 
     for (unsigned i = 0; i < 8; i++) {
       logger().debug("opened split transaction");
-      auto t = tm->create_transaction();
+      auto t = create_mutate_transaction();
 
       for (unsigned j = 0; j < 80; ++j) {
         set_random_key(omap_root, *t);
@@ -492,7 +492,7 @@ TEST_F(omap_manager_test_t, replay)
     check_mappings(omap_root);
 
     auto mkeys = get_mapped_keys();
-    auto t = tm->create_transaction();
+    auto t = create_mutate_transaction();
     for (unsigned i = 0; i < mkeys.size(); i++) {
       rm_key(omap_root, *t, mkeys[i]);
 
@@ -500,7 +500,7 @@ TEST_F(omap_manager_test_t, replay)
         logger().debug("submitting transaction i= {}", i);
         submit_transaction(std::move(t));
         replay();
-        t = tm->create_transaction();
+        t = create_mutate_transaction();
       }
       if (i % 50 == 0) {
         logger().debug("check_mappings  i= {}", i);
@@ -524,7 +524,7 @@ TEST_F(omap_manager_test_t, internal_force_split_to_root)
 
     logger().debug("set big keys");
     for (unsigned i = 0; i < 53; i++) {
-      auto t = tm->create_transaction();
+      auto t = create_mutate_transaction();
 
       for (unsigned j = 0; j < 8; ++j) {
         set_random_key(omap_root, *t);
@@ -534,7 +534,7 @@ TEST_F(omap_manager_test_t, internal_force_split_to_root)
     }
      logger().debug("set small keys");
      for (unsigned i = 0; i < 100; i++) {
-       auto t = tm->create_transaction();
+       auto t = create_mutate_transaction();
        for (unsigned j = 0; j < 8; ++j) {
          set_random_key(omap_root, *t);
        }
index ca21453ddd1d1524af8ef08b3f7e841bf73ad2b1..8065cd7b65962f7fa290df1bd730d75f68fd1fb6 100644 (file)
@@ -103,7 +103,7 @@ struct rbm_test_t : public  seastar_test_suite_t,
   }
 
   auto alloc_extent(rbm_transaction &t, size_t size) {
-    auto tt = tm->create_transaction(); // dummy transaction
+    auto tt = create_mutate_transaction(); // dummy transaction
     auto extent = rbm_manager->find_free_block(*tt, size).unsafe_get0();
     if (!extent.empty()) {
       rbm_alloc_delta_t alloc_info {
index 42d285671e96be57da0728e9df265de75488ca11..d53e0df7904043b60cb1d29acd032bd06952ba83 100644 (file)
@@ -62,7 +62,7 @@ struct cache_test_t : public seastar_test_suite_t {
   }
 
   auto get_transaction() {
-    return cache.create_transaction();
+    return cache.create_transaction(Transaction::src_t::MUTATE);
   }
 
   template <typename T, typename... Args>
@@ -80,7 +80,7 @@ struct cache_test_t : public seastar_test_suite_t {
     ).safe_then(
       [this] {
        return seastar::do_with(
-         cache.create_transaction(),
+         get_transaction(),
          [this](auto &transaction) {
            cache.init();
            return cache.mkfs(*transaction).safe_then(
index 0325dfc32d73715ba79199e6ffc9a090b4d14dae..db93baaeb673f75f0e8b27c7767e8abc463570cd 100644 (file)
@@ -351,11 +351,11 @@ struct transaction_manager_test_t :
   };
 
   test_transaction_t create_transaction() {
-    return { itm.create_transaction(), {} };
+    return { create_mutate_transaction(), {} };
   }
 
-  test_transaction_t create_weak_transaction() {
-    return { itm.create_weak_transaction(), {} };
+  test_transaction_t create_weak_test_transaction() {
+    return { create_weak_transaction(), {} };
   }
 
   TestBlockRef alloc_extent(
@@ -386,7 +386,7 @@ struct transaction_manager_test_t :
   }
 
   bool check_usage() {
-    auto t = create_weak_transaction();
+    auto t = create_weak_test_transaction();
     SpaceTrackerIRef tracker(segment_cleaner->get_empty_space_tracker());
     with_trans_intr(
       *t.t,
@@ -416,7 +416,7 @@ struct transaction_manager_test_t :
   }
 
   void check_mappings() {
-    auto t = create_weak_transaction();
+    auto t = create_weak_test_transaction();
     check_mappings(t);
   }
 
index 22c9fa738e9a35e2149346062eb0ec1bc242a810..ef343f5f464eb1db989d0bd91538173b94bb2328 100644 (file)
@@ -148,6 +148,18 @@ protected:
     );
   }
 
+  auto create_mutate_transaction() {
+    return tm->create_transaction(Transaction::src_t::MUTATE);
+  }
+
+  auto create_read_transaction() {
+    return tm->create_transaction(Transaction::src_t::READ);
+  }
+
+  auto create_weak_transaction() {
+    return tm->create_weak_transaction(Transaction::src_t::READ);
+  }
+
   auto submit_transaction_fut(Transaction &t) {
     return with_trans_intr(
       t,
index 3f5f98fc28aae84c0c29179b229d84c47a6725e4..687b0ef3928ac36caa87d5320220d07ca5276824 100644 (file)
@@ -34,12 +34,12 @@ class PerfTree : public TMTestState {
             (is_dummy ? NodeExtentManager::create_dummy(true)
                       : NodeExtentManager::create_seastore(*tm)));
         {
-          auto t = tm->create_transaction();
+          auto t = create_mutate_transaction();
           tree->bootstrap(*t).unsafe_get();
           submit_transaction(std::move(t));
         }
         {
-          auto t = tm->create_transaction();
+          auto t = create_mutate_transaction();
           tree->insert(*t).unsafe_get();
           auto start_time = mono_clock::now();
           submit_transaction(std::move(t));
@@ -47,18 +47,18 @@ class PerfTree : public TMTestState {
           logger().warn("submit_transaction() done! {}s", duration.count());
         }
         {
-          // Note: tm->create_weak_transaction() can also work, but too slow.
-          auto t = tm->create_transaction();
+          // Note: create_weak_transaction() can also work, but too slow.
+          auto t = create_read_transaction();
           tree->get_stats(*t).unsafe_get();
           tree->validate(*t).unsafe_get();
         }
         {
-          auto t = tm->create_transaction();
+          auto t = create_mutate_transaction();
           tree->erase(*t, kvs.size() * erase_ratio).unsafe_get();
           submit_transaction(std::move(t));
         }
         {
-          auto t = tm->create_transaction();
+          auto t = create_read_transaction();
           tree->get_stats(*t).unsafe_get();
           tree->validate(*t).unsafe_get();
         }