};
using TransactionManagerRef = std::unique_ptr<TransactionManager>;
-#define FORWARD(METHOD) \
- template <typename... Args> \
- auto METHOD(Args&&... args) const { \
- return tm->METHOD(std::forward<Args>(args)...); \
- }
-
-#define PARAM_FORWARD(METHOD) \
- template <typename T, typename... Args> \
- auto METHOD(Args&&... args) const { \
- return tm->METHOD<T>(std::forward<Args>(args)...); \
- }
-
-#define INT_FORWARD(METHOD) \
- template <typename... Args> \
- auto METHOD(Transaction &t, Args&&... args) const { \
- return with_trans_intr( \
- t, \
- [this](auto&&... args) { \
- return tm->METHOD(std::forward<decltype(args)>(args)...); \
- }, \
- std::forward<Args>(args)...); \
- }
-
-#define PARAM_INT_FORWARD(METHOD) \
- template <typename T, typename... Args> \
- auto METHOD(Transaction &t, Args&&... args) const { \
- return with_trans_intr( \
- t, \
- [this](auto&&... args) { \
- return tm->METHOD<T>(std::forward<decltype(args)>(args)...); \
- }, \
- std::forward<Args>(args)...); \
- }
-
-/// Temporary translator to non-interruptible futures
-class InterruptedTransactionManager {
- TransactionManager *tm = nullptr;
-public:
- InterruptedTransactionManager() = default;
- InterruptedTransactionManager(const InterruptedTransactionManager &) = default;
- InterruptedTransactionManager(InterruptedTransactionManager &&) = default;
- InterruptedTransactionManager(TransactionManager &tm) : tm(&tm) {}
-
- InterruptedTransactionManager &operator=(
- const InterruptedTransactionManager &) = default;
- InterruptedTransactionManager &operator=(
- InterruptedTransactionManager &&) = default;
-
- TransactionManager &get_tm() const { return *tm; }
-
- FORWARD(mkfs)
- FORWARD(mount)
- FORWARD(close)
- FORWARD(create_transaction)
- FORWARD(create_weak_transaction)
- FORWARD(reset_transaction_preserve_handle)
- INT_FORWARD(get_pin)
- INT_FORWARD(get_pins)
- PARAM_INT_FORWARD(pin_to_extent)
- PARAM_INT_FORWARD(read_extent)
- FORWARD(get_mutable_extent)
- INT_FORWARD(inc_ref)
- INT_FORWARD(dec_ref)
- PARAM_INT_FORWARD(alloc_extent)
- INT_FORWARD(reserve_region)
- INT_FORWARD(find_hole)
- PARAM_INT_FORWARD(alloc_extents)
- INT_FORWARD(submit_transaction)
-
- INT_FORWARD(read_root_meta)
- INT_FORWARD(update_root_meta)
- INT_FORWARD(read_onode_root)
- FORWARD(write_onode_root)
- INT_FORWARD(read_collection_root)
- FORWARD(write_collection_root)
- FORWARD(get_block_size)
- FORWARD(store_stat)
-
- FORWARD(get_segment_cleaner)
- FORWARD(get_lba_manager)
-
- void reset() { tm = nullptr; }
-};
-
-class InterruptedTMRef {
- std::unique_ptr<TransactionManager> ref;
- std::optional<InterruptedTransactionManager> itm;
-public:
- InterruptedTMRef() {}
-
- template <typename... T>
- InterruptedTMRef(T&&... args)
- : ref(std::make_unique<TransactionManager>(std::forward<T>(args)...)),
- itm(*ref) {}
-
- InterruptedTMRef(std::unique_ptr<TransactionManager> tm)
- : ref(std::move(tm)), itm(*ref) {}
-
- InterruptedTMRef(InterruptedTMRef &&itmr)
- : ref(std::move(itmr.ref)), itm(*ref) {}
-
- InterruptedTMRef &operator=(std::unique_ptr<TransactionManager> tm) {
- this->~InterruptedTMRef();
- new (this) InterruptedTMRef(std::move(tm));
- return *this;
- }
-
- InterruptedTMRef &operator=(InterruptedTMRef &&rhs) {
- this->~InterruptedTMRef();
- new (this) InterruptedTMRef(std::move(rhs));
- return *this;
- }
-
- void reset() {
- itm = std::nullopt;
- ref.reset();
- }
-
- auto &operator*() const {
- return *itm;
- }
-
- auto operator->() const {
- return &*itm;
- }
-};
-
-
-
}
laddr_t hint,
extent_len_t len,
char contents) {
- auto extent = itm.alloc_extent<TestBlock>(
- *(t.t),
- hint,
- len).unsafe_get0();
+ auto extent = with_trans_intr(*(t.t), [&](auto& trans) {
+ return tm->alloc_extent<TestBlock>(trans, hint, len);
+ }).unsafe_get0();
extent->set_contents(contents);
EXPECT_FALSE(test_mappings.contains(extent->get_laddr(), t.mapping_delta));
EXPECT_EQ(len, extent->get_length());
ceph_assert(test_mappings.contains(addr, t.mapping_delta));
ceph_assert(test_mappings.get(addr, t.mapping_delta).desc.len == len);
- auto ext = itm.read_extent<TestBlock>(
- *t.t, addr, len
- ).unsafe_get0();
+ auto ext = with_trans_intr(*(t.t), [&](auto& trans) {
+ return tm->read_extent<TestBlock>(trans, addr, len);
+ }).unsafe_get0();
EXPECT_EQ(addr, ext->get_laddr());
return ext;
}
using ertr = with_trans_ertr<TransactionManager::read_extent_iertr>;
using ret = ertr::future<TestBlockRef>;
- auto ext = itm.read_extent<TestBlock>(
- *t.t, addr, len
- ).safe_then([](auto ext) -> ret {
+ auto ext = with_trans_intr(*(t.t), [&](auto& trans) {
+ return tm->read_extent<TestBlock>(trans, addr, len);
+ }).safe_then([](auto ext) -> ret {
return ertr::make_ready_future<TestBlockRef>(ext);
}).handle_error(
[](const crimson::ct_error::eagain &e) {
test_mappings.get(ref->get_laddr(), t.mapping_delta).desc.len ==
ref->get_length());
- auto ext = itm.get_mutable_extent(*t.t, ref)->cast<TestBlock>();
+ auto ext = tm->get_mutable_extent(*t.t, ref)->cast<TestBlock>();
EXPECT_EQ(ext->get_laddr(), ref->get_laddr());
EXPECT_EQ(ext->get_desc(), ref->get_desc());
mutator.mutate(*ext, gen);
ceph_assert(test_mappings.contains(offset, t.mapping_delta));
ceph_assert(test_mappings.get(offset, t.mapping_delta).refcount > 0);
- auto refcnt = itm.inc_ref(*t.t, offset).unsafe_get0();
+ auto refcnt = with_trans_intr(*(t.t), [&](auto& trans) {
+ return tm->inc_ref(trans, offset);
+ }).unsafe_get0();
auto check_refcnt = test_mappings.inc_ref(offset, t.mapping_delta);
EXPECT_EQ(refcnt, check_refcnt);
}
ceph_assert(test_mappings.contains(offset, t.mapping_delta));
ceph_assert(test_mappings.get(offset, t.mapping_delta).refcount > 0);
- auto refcnt = itm.dec_ref(*t.t, offset).unsafe_get0();
+ auto refcnt = with_trans_intr(*(t.t), [&](auto& trans) {
+ return tm->dec_ref(trans, offset);
+ }).unsafe_get0();
auto check_refcnt = test_mappings.dec_ref(offset, t.mapping_delta);
EXPECT_EQ(refcnt, check_refcnt);
if (refcnt == 0)
bool try_submit_transaction(test_transaction_t t) {
using ertr = with_trans_ertr<TransactionManager::submit_transaction_iertr>;
using ret = ertr::future<bool>;
- bool success = itm.submit_transaction(*t.t
+ bool success = submit_transaction_fut(*t.t
).safe_then([]() -> ret {
return ertr::make_ready_future<bool>(true);
}).handle_error(