LOG_PREFIX(Cache::invalidate_extent);
bool do_conflict_log = true;
+ std::vector<Transaction*> invalidated_trans;
for (auto &&i: extent.read_transactions) {
if (!i.t->conflicted) {
if (do_conflict_log) {
assert(!i.t->is_weak());
account_conflict(t.get_src(), i.t->get_src());
mark_transaction_conflicted(*i.t, extent);
+ invalidated_trans.emplace_back(i.t);
}
}
+ for (auto trans : invalidated_trans) {
+ trans->clear_read_set();
+ trans->invalidate_clear_write_set();
+ trans->retired_set.clear();
+ trans->views.clear();
+ }
extent.set_invalid(t);
}
++(get_by_src(stats.trans_created_by_src, src));
- auto ret = std::make_unique<Transaction>(
+ auto ret = boost::intrusive_ptr(new Transaction(
get_dummy_ordering_handle(),
is_weak,
src,
return on_transaction_destruct(t);
},
++next_id,
- cache_hint
+ cache_hint)
);
SUBDEBUGT(seastore_t, "created name={}, source={}, is_weak={}",
*ret, name, src, is_weak);
* - TRACE: DEBUG details
* - seastore_cache logs
*/
-class Transaction {
+class Transaction : public boost::intrusive_ref_counter<
+ Transaction, boost::thread_unsafe_counter> {
public:
- using Ref = std::unique_ptr<Transaction>;
+ using Ref = boost::intrusive_ptr<Transaction>;
using on_destruct_func_t = std::function<void(Transaction&)>;
enum class get_extent_ret {
PRESENT,
/// Should only be used with dummy staged-fltree node extent manager
inline TransactionRef make_test_transaction() {
static transaction_id_t next_id = 0;
- return std::make_unique<Transaction>(
+ return boost::intrusive_ptr(new Transaction(
get_dummy_ordering_handle(),
false,
Transaction::src_t::MUTATE,
[](Transaction&) {},
++next_id,
- CACHE_HINT_TOUCH
+ CACHE_HINT_TOUCH)
);
}
};
public:
- TransactionConflictCondition(Transaction &t) : t(t) {}
+ TransactionConflictCondition(Transaction &t) : t(t), tref(&t) {}
template <typename Fut>
std::optional<Fut> may_interrupt() {
bool is_conflicted() const;
Transaction &t;
+ TransactionRef tref;
};
using trans_intr = crimson::interruptible::interruptor<