From 1a76129c2bfee7cf6c00cff3fc72a07daf229bf9 Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Wed, 20 Nov 2024 10:04:18 +0800 Subject: [PATCH] crimson/os/seastore: split out transaction_interruptor.h Signed-off-by: Yingxin Cheng --- src/crimson/os/seastore/CMakeLists.txt | 1 + src/crimson/os/seastore/transaction.h | 59 +------------- .../os/seastore/transaction_interruptor.cc | 15 ++++ .../os/seastore/transaction_interruptor.h | 77 +++++++++++++++++++ 4 files changed, 94 insertions(+), 58 deletions(-) create mode 100644 src/crimson/os/seastore/transaction_interruptor.cc create mode 100644 src/crimson/os/seastore/transaction_interruptor.h diff --git a/src/crimson/os/seastore/CMakeLists.txt b/src/crimson/os/seastore/CMakeLists.txt index 4bdbab8c4e5de..e5b8960c38c1b 100644 --- a/src/crimson/os/seastore/CMakeLists.txt +++ b/src/crimson/os/seastore/CMakeLists.txt @@ -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 diff --git a/src/crimson/os/seastore/transaction.h b/src/crimson/os/seastore/transaction.h index 5d8ad00ba228b..9b95161a404d5 100644 --- a/src/crimson/os/seastore/transaction.h +++ b/src/crimson/os/seastore/transaction.h @@ -13,11 +13,11 @@ #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 - std::optional may_interrupt() { - if (t.conflicted) { - return seastar::futurize::make_exception_future( - transaction_conflict()); - } else { - return std::optional(); - } - } - - template - static constexpr bool is_interruption_v = - std::is_same_v; - - - 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 -using trans_iertr = - crimson::interruptible::interruptible_errorator< - TransactionConflictCondition, - E - >; - -template -auto with_trans_intr(Transaction &t, F &&f, Args&&... args) { - return trans_intr::with_interruption_to_error( - std::move(f), - TransactionConflictCondition(t), - t, - std::forward(args)...); -} - -template -using with_trans_ertr = typename T::base_ertr::template extend; - } #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 index 0000000000000..d22f760f2db25 --- /dev/null +++ b/src/crimson/os/seastore/transaction_interruptor.cc @@ -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 index 0000000000000..d0522c23c19eb --- /dev/null +++ b/src/crimson/os/seastore/transaction_interruptor.h @@ -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 +#include +#include +#include + +#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 + std::optional may_interrupt() { + if (is_conflicted()) { + return seastar::futurize::make_exception_future( + transaction_conflict()); + } else { + return std::optional(); + } + } + + template + static constexpr bool is_interruption_v = + std::is_same_v; + + + 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 +using trans_iertr = + crimson::interruptible::interruptible_errorator< + TransactionConflictCondition, + E + >; + +template +auto with_trans_intr(Transaction &t, F &&f, Args&&... args) { + return trans_intr::with_interruption_to_error( + std::move(f), + TransactionConflictCondition(t), + t, + std::forward(args)...); +} + +template +using with_trans_ertr = typename T::base_ertr::template extend; + +} // namespace crimson::os::seastore -- 2.39.5