From be4ef01975d94eaa4c6b9f7a650a3abbbd0ee1b2 Mon Sep 17 00:00:00 2001 From: Vladislav Date: Fri, 24 Feb 2023 22:55:56 +0300 Subject: [PATCH] fix(server): Reorder ExecuteAsync callback seqlock check (#873) fix(server): Reoder cb check Signed-off-by: Vladislav Oleshko --- src/server/transaction.cc | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/server/transaction.cc b/src/server/transaction.cc index 7702477c2..cc3bbd36d 100644 --- a/src/server/transaction.cc +++ b/src/server/transaction.cc @@ -791,12 +791,8 @@ void Transaction::ExecuteAsync() { auto cb = [seq, this] { EngineShard* shard = EngineShard::tlocal(); - uint16_t local_mask = GetLocalMask(shard->shard_id()); - - // we use fetch_add with release trick to make sure that local_mask is loaded before - // we load seq_after. We could gain similar result with "atomic_thread_fence(acquire)" - uint32_t seq_after = seqlock_.fetch_add(0, memory_order_release); - bool should_poll = (seq_after == seq) && (local_mask & ARMED); + uint32_t seq_after = seqlock_.load(memory_order_acquire); + bool should_poll = (seq_after == seq) && (GetLocalMask(shard->shard_id()) & ARMED); DVLOG(2) << "PollExecCb " << DebugId() << " sid(" << shard->shard_id() << ") " << run_count_.load(memory_order_relaxed) << ", should_poll: " << should_poll;