From: Samuel Just Date: Mon, 28 Jun 2021 21:24:44 +0000 (-0700) Subject: crimson/os/seastore/seastore: preserve Transaction::handle on reset for writes X-Git-Tag: v17.1.0~1509^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c96faa8e8b6bfd29f236f0bec7c529d51036d3f8;p=ceph.git crimson/os/seastore/seastore: preserve Transaction::handle on reset for writes We're going to need to preserve the pipeline phase locking on conflict. Signed-off-by: Samuel Just --- diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 159b33395c2..1a9998cc7f2 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -120,6 +120,11 @@ public: return ret; } + /// Resets transaction preserving + void reset_transaction_preserve_handle(Transaction &t) { + t.reset_preserve_handle(last_commit); + } + /** * drop_from_cache * diff --git a/src/crimson/os/seastore/cached_extent.h b/src/crimson/os/seastore/cached_extent.h index c32d01ade07..856791800b9 100644 --- a/src/crimson/os/seastore/cached_extent.h +++ b/src/crimson/os/seastore/cached_extent.h @@ -635,7 +635,22 @@ public: list_hook_options>; public: token_t(journal_seq_t created_after) : created_after(created_after) {} - ~token_t(); + + void drop_self(); + void add_self(); + + void reset(journal_seq_t _created_after) { + drop_self(); + created_after = _created_after; + add_self(); + } + + ~token_t() { + if (parent) { + drop_self(); + parent = nullptr; + } + } }; void prune() { @@ -651,7 +666,7 @@ public: void add_token(token_t &t) { t.parent = this; - live_tokens.push_back(t); + t.add_self(); } void add_extent(CachedExtent &extent) { @@ -664,13 +679,16 @@ private: CachedExtent::list retired_extents; }; -inline retired_extent_gate_t::token_t::~token_t() { - if (parent) { - parent->live_tokens.erase( - parent->live_tokens.s_iterator_to(*this)); - parent->prune(); - parent = nullptr; - } +inline void retired_extent_gate_t::token_t::add_self() { + assert(parent); + parent->live_tokens.push_back(*this); +} + +inline void retired_extent_gate_t::token_t::drop_self() { + assert(parent); + parent->live_tokens.erase( + parent->live_tokens.s_iterator_to(*this)); + parent->prune(); } /** diff --git a/src/crimson/os/seastore/seastore.h b/src/crimson/os/seastore/seastore.h index f32052a8d00..c745daf13b3 100644 --- a/src/crimson/os/seastore/seastore.h +++ b/src/crimson/os/seastore/seastore.h @@ -137,8 +137,9 @@ private: ceph::os::Transaction::iterator iter; - void reset(TransactionRef &&t) { - transaction = std::move(t); + template + void reset_preserve_handle(TM &tm) { + tm->reset_transaction_preserve_handle(*transaction); onodes.clear(); iter = ext_transaction.begin(); } @@ -152,11 +153,13 @@ private: ceph::os::Transaction &&t, F &&f) { return seastar::do_with( - internal_context_t{ ch, std::move(t) }, + internal_context_t( + ch, std::move(t), + transaction_manager->create_transaction()), std::forward(f), [this](auto &ctx, auto &f) { return repeat_eagain([&]() { - ctx.reset(transaction_manager->create_transaction()); + ctx.reset_preserve_handle(transaction_manager); return std::invoke(f, ctx); }).handle_error( crimson::ct_error::eagain::pass_further{}, diff --git a/src/crimson/os/seastore/transaction.h b/src/crimson/os/seastore/transaction.h index b39a20419ce..25b437f2770 100644 --- a/src/crimson/os/seastore/transaction.h +++ b/src/crimson/os/seastore/transaction.h @@ -144,6 +144,20 @@ public: friend class crimson::os::seastore::SeaStore; friend class TransactionConflictCondition; + void reset_preserve_handle(journal_seq_t initiated_after) { + root.reset(); + offset = 0; + read_set.clear(); + write_set.clear(); + fresh_block_list.clear(); + mutated_block_list.clear(); + retired_set.clear(); + to_release = NULL_SEG_ID; + retired_uncached.clear(); + retired_gate_token.reset(initiated_after); + conflicted = false; + } + private: friend class Cache; friend Ref make_test_transaction(); diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index f0e588a3078..38796b720cb 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -116,6 +116,11 @@ public: return cache->create_weak_transaction(); } + /// Resets transaction + void reset_transaction_preserve_handle(Transaction &t) { + return cache->reset_transaction_preserve_handle(t); + } + /** * get_pin * @@ -612,6 +617,7 @@ public: 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)