]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: split out transaction_interruptor.h
authorYingxin Cheng <yingxin.cheng@intel.com>
Wed, 20 Nov 2024 02:04:18 +0000 (10:04 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Thu, 28 Nov 2024 01:32:51 +0000 (09:32 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/CMakeLists.txt
src/crimson/os/seastore/transaction.h
src/crimson/os/seastore/transaction_interruptor.cc [new file with mode: 0644]
src/crimson/os/seastore/transaction_interruptor.h [new file with mode: 0644]

index 4bdbab8c4e5de8d997cc2fd2c9f11b793126b15a..e5b8960c38c1bb5a4f0dcdfd1cb8ccfbbe52128e 100644 (file)
@@ -4,6 +4,7 @@ set(crimson_seastore_srcs
   segment_manager.cc
   segment_manager/ephemeral.cc
   segment_manager/block.cc
+  transaction_interruptor.cc
   transaction_manager.cc
   transaction.cc
   cache.cc
index 5d8ad00ba228bd9b3644ffac1226f24b62427bf4..9b95161a404d549e0c6bc1a010ef40bb2f05ebc2 100644 (file)
 #include "crimson/os/seastore/seastore_types.h"
 #include "crimson/os/seastore/cached_extent.h"
 #include "crimson/os/seastore/root_block.h"
+#include "crimson/os/seastore/transaction_interruptor.h"
 
 namespace crimson::os::seastore {
 
 class SeaStore;
-class Transaction;
 
 struct io_stat_t {
   uint64_t num = 0;
@@ -685,63 +685,6 @@ inline TransactionRef make_test_transaction() {
   );
 }
 
-struct TransactionConflictCondition {
-  class transaction_conflict final : public std::exception {
-  public:
-    const char* what() const noexcept final {
-      return "transaction conflict detected";
-    }
-  };
-
-public:
-  TransactionConflictCondition(Transaction &t) : t(t) {}
-
-  template <typename Fut>
-  std::optional<Fut> may_interrupt() {
-    if (t.conflicted) {
-      return seastar::futurize<Fut>::make_exception_future(
-       transaction_conflict());
-    } else {
-      return std::optional<Fut>();
-    }
-  }
-
-  template <typename T>
-  static constexpr bool is_interruption_v =
-    std::is_same_v<T, transaction_conflict>;
-
-
-  static bool is_interruption(std::exception_ptr& eptr) {
-    return *eptr.__cxa_exception_type() == typeid(transaction_conflict);
-  }
-
-private:
-  Transaction &t;
-};
-
-using trans_intr = crimson::interruptible::interruptor<
-  TransactionConflictCondition
-  >;
-
-template <typename E>
-using trans_iertr =
-  crimson::interruptible::interruptible_errorator<
-    TransactionConflictCondition,
-    E
-  >;
-
-template <typename F, typename... Args>
-auto with_trans_intr(Transaction &t, F &&f, Args&&... args) {
-  return trans_intr::with_interruption_to_error<crimson::ct_error::eagain>(
-    std::move(f),
-    TransactionConflictCondition(t),
-    t,
-    std::forward<Args>(args)...);
-}
-
-template <typename T>
-using with_trans_ertr = typename T::base_ertr::template extend<crimson::ct_error::eagain>;
-
 }
 
 #if FMT_VERSION >= 90000
diff --git a/src/crimson/os/seastore/transaction_interruptor.cc b/src/crimson/os/seastore/transaction_interruptor.cc
new file mode 100644 (file)
index 0000000..d22f760
--- /dev/null
@@ -0,0 +1,15 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include "crimson/os/seastore/transaction_interruptor.h"
+
+#include "crimson/os/seastore/transaction.h"
+
+namespace crimson::os::seastore {
+
+bool TransactionConflictCondition::is_conflicted() const
+{
+  return t.conflicted;
+}
+
+}
diff --git a/src/crimson/os/seastore/transaction_interruptor.h b/src/crimson/os/seastore/transaction_interruptor.h
new file mode 100644 (file)
index 0000000..d0522c2
--- /dev/null
@@ -0,0 +1,77 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#pragma once
+
+#include <exception>
+#include <optional>
+#include <type_traits>
+#include <utility>
+
+#include "crimson/common/errorator.h"
+#include "crimson/common/interruptible_future.h"
+
+namespace crimson::os::seastore {
+
+class Transaction;
+
+struct TransactionConflictCondition {
+  class transaction_conflict final : public std::exception {
+  public:
+    const char* what() const noexcept final {
+      return "transaction conflict detected";
+    }
+  };
+
+public:
+  TransactionConflictCondition(Transaction &t) : t(t) {}
+
+  template <typename Fut>
+  std::optional<Fut> may_interrupt() {
+    if (is_conflicted()) {
+      return seastar::futurize<Fut>::make_exception_future(
+       transaction_conflict());
+    } else {
+      return std::optional<Fut>();
+    }
+  }
+
+  template <typename T>
+  static constexpr bool is_interruption_v =
+    std::is_same_v<T, transaction_conflict>;
+
+
+  static bool is_interruption(std::exception_ptr& eptr) {
+    return *eptr.__cxa_exception_type() == typeid(transaction_conflict);
+  }
+
+private:
+  bool is_conflicted() const;
+
+  Transaction &t;
+};
+
+using trans_intr = crimson::interruptible::interruptor<
+  TransactionConflictCondition
+  >;
+
+template <typename E>
+using trans_iertr =
+  crimson::interruptible::interruptible_errorator<
+    TransactionConflictCondition,
+    E
+  >;
+
+template <typename F, typename... Args>
+auto with_trans_intr(Transaction &t, F &&f, Args&&... args) {
+  return trans_intr::with_interruption_to_error<crimson::ct_error::eagain>(
+    std::move(f),
+    TransactionConflictCondition(t),
+    t,
+    std::forward<Args>(args)...);
+}
+
+template <typename T>
+using with_trans_ertr = typename T::base_ertr::template extend<crimson::ct_error::eagain>;
+
+} // namespace crimson::os::seastore