invalidate(*prev);
}
-void Cache::invalidate(CachedExtent &extent) {
+void Cache::invalidate(CachedExtent &extent)
+{
LOG_PREFIX(Cache::invalidate);
DEBUG("invalidate begin -- extent {}", extent);
for (auto &&i: extent.transactions) {
if (!i.t->conflicted) {
- DEBUGT("set conflict", *i.t);
- i.t->conflicted = true;
assert(!i.t->is_weak());
- auto m_key = std::make_pair(i.t->get_src(), extent.get_type());
- assert(stats.trans_invalidated.count(m_key));
- ++(stats.trans_invalidated[m_key]);
+ invalidate(*i.t, extent);
}
}
DEBUG("invalidate end");
extent.state = CachedExtent::extent_state_t::INVALID;
}
+void Cache::invalidate(Transaction& t, CachedExtent& conflicting_extent)
+{
+ LOG_PREFIX(Cache::invalidate);
+ assert(!t.conflicted);
+ DEBUGT("set conflict", t);
+ t.conflicted = true;
+ auto m_key = std::make_pair(
+ t.get_src(), conflicting_extent.get_type());
+ assert(stats.trans_invalidated.count(m_key));
+ ++(stats.trans_invalidated[m_key]);
+}
+
CachedExtentRef Cache::alloc_new_extent_by_type(
Transaction &t, ///< [in, out] current transaction
extent_types_t type, ///< [in] type tag
if (!ref->is_valid()) {
LOG_PREFIX(Cache::get_extent);
DEBUGT("got invalid extent: {}", t, ref);
- t.conflicted = true;
- auto m_key = std::make_pair(t.get_src(), T::TYPE);
- assert(stats.trans_invalidated.count(m_key));
- ++(stats.trans_invalidated[m_key]);
+ invalidate(t, *ref.get());
return get_extent_iertr::make_ready_future<TCachedExtentRef<T>>();
} else {
t.add_to_read_set(ref);
if (!ret->is_valid()) {
LOG_PREFIX(Cache::get_extent_by_type);
DEBUGT("got invalid extent: {}", t, ret);
- t.conflicted = true;
- auto m_key = std::make_pair(t.get_src(), type);
- assert(stats.trans_invalidated.count(m_key));
- ++(stats.trans_invalidated[m_key]);
+ invalidate(t, *ret.get());
return get_extent_ertr::make_ready_future<CachedExtentRef>();
} else {
t.add_to_read_set(ret);
/// Invalidate extent and mark affected transactions
void invalidate(CachedExtent &extent);
+ /// Mark a valid transaction as conflicted
+ void invalidate(Transaction& t, CachedExtent& conflicting_extent);
+
template <typename T>
get_extent_ret<T> read_extent(
TCachedExtentRef<T>&& extent