mirror of
https://github.com/dragonflydb/dragonfly.git
synced 2025-05-10 18:05:44 +02:00
chore: little transaction cleanup (#2608)
Make renabled_autojournal a regular bool, simplify CancelShardCb logic Signed-off-by: Vladislav Oleshko <vlad@dragonflydb.io> --------- Signed-off-by: Vladislav Oleshko <vlad@dragonflydb.io>
This commit is contained in:
parent
22e413a00b
commit
292c5bcd71
4 changed files with 63 additions and 67 deletions
|
@ -27,6 +27,7 @@ thread_local Transaction::TLTmpSpace Transaction::tmp_space;
|
|||
|
||||
namespace {
|
||||
|
||||
// Global txid sequence
|
||||
atomic_uint64_t op_seq{1};
|
||||
|
||||
constexpr size_t kTransSize [[maybe_unused]] = sizeof(Transaction);
|
||||
|
@ -90,12 +91,12 @@ std::ostream& operator<<(std::ostream& os, Transaction::time_point tp) {
|
|||
return os << ms << "ms";
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
IntentLock::Mode Transaction::LockMode() const {
|
||||
return cid_->IsReadOnly() ? IntentLock::SHARED : IntentLock::EXCLUSIVE;
|
||||
uint16_t trans_id(const Transaction* ptr) {
|
||||
return (intptr_t(ptr) >> 8) & 0xFFFF;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
void Transaction::PhasedBarrier::Start(uint32_t count) {
|
||||
DCHECK_EQ(DEBUG_Count(), 0u);
|
||||
count_.store(count, memory_order_release);
|
||||
|
@ -159,13 +160,6 @@ cv_status Transaction::BatonBarrier::Wait(time_point tp) {
|
|||
return cv_status::no_timeout;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Construct a new Transaction:: Transaction object
|
||||
*
|
||||
* @param cid
|
||||
* @param ess
|
||||
* @param cs
|
||||
*/
|
||||
Transaction::Transaction(const CommandId* cid) : cid_{cid} {
|
||||
InitTxTime();
|
||||
string_view cmd_name(cid_->name());
|
||||
|
@ -1155,6 +1149,16 @@ uint16_t Transaction::GetLocalMask(ShardId sid) const {
|
|||
return shard_data_[SidToId(sid)].local_mask;
|
||||
}
|
||||
|
||||
IntentLock::Mode Transaction::LockMode() const {
|
||||
return cid_->IsReadOnly() ? IntentLock::SHARED : IntentLock::EXCLUSIVE;
|
||||
}
|
||||
|
||||
OpArgs Transaction::GetOpArgs(EngineShard* shard) const {
|
||||
DCHECK(IsActive(shard->shard_id()));
|
||||
DCHECK((multi_ && multi_->role == SQUASHED_STUB) || (run_barrier_.DEBUG_Count() > 0));
|
||||
return OpArgs{shard, this, GetDbContext()};
|
||||
}
|
||||
|
||||
// Runs within a engine shard thread.
|
||||
// Optimized path that schedules and runs transactions out of order if possible.
|
||||
// Returns true if eagerly executed, false if the callback will be handled by the transaction
|
||||
|
@ -1278,35 +1282,31 @@ bool Transaction::CancelShardCb(EngineShard* shard) {
|
|||
ShardId idx = SidToId(shard->shard_id());
|
||||
auto& sd = shard_data_[idx];
|
||||
|
||||
auto pos = sd.pq_pos;
|
||||
if (pos == TxQueue::kEnd)
|
||||
TxQueue::Iterator q_pos = exchange(sd.pq_pos, TxQueue::kEnd);
|
||||
if (q_pos == TxQueue::kEnd) {
|
||||
DCHECK_EQ(sd.local_mask & KEYLOCK_ACQUIRED, 0);
|
||||
return false;
|
||||
|
||||
sd.pq_pos = TxQueue::kEnd;
|
||||
}
|
||||
|
||||
TxQueue* txq = shard->txq();
|
||||
TxQueue::Iterator head = txq->Head();
|
||||
auto val = txq->At(pos);
|
||||
Transaction* trans = absl::get<Transaction*>(val);
|
||||
DCHECK(trans == this) << "Pos " << pos << ", txq size " << txq->size() << ", trans " << trans;
|
||||
txq->Remove(pos);
|
||||
bool was_head = txq->Head() == q_pos;
|
||||
|
||||
Transaction* trans = absl::get<Transaction*>(txq->At(q_pos));
|
||||
DCHECK(trans == this) << txq->size() << ' ' << sd.pq_pos << ' ' << trans->DebugId();
|
||||
txq->Remove(q_pos);
|
||||
|
||||
if (sd.local_mask & KEYLOCK_ACQUIRED) {
|
||||
auto mode = LockMode();
|
||||
auto lock_args = GetLockArgs(shard->shard_id());
|
||||
DCHECK(lock_args.args.size() > 0);
|
||||
shard->db_slice().Release(mode, lock_args);
|
||||
sd.local_mask &= ~KEYLOCK_ACQUIRED;
|
||||
}
|
||||
if (IsGlobal()) {
|
||||
shard->shard_lock()->Release(LockMode());
|
||||
} else {
|
||||
auto lock_args = GetLockArgs(shard->shard_id());
|
||||
DCHECK(sd.local_mask & KEYLOCK_ACQUIRED);
|
||||
DCHECK(!lock_args.args.empty());
|
||||
shard->db_slice().Release(LockMode(), lock_args);
|
||||
sd.local_mask &= ~KEYLOCK_ACQUIRED;
|
||||
}
|
||||
|
||||
if (pos == head && !txq->Empty()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
// Check if we need to poll the next head
|
||||
return was_head && !txq->Empty();
|
||||
}
|
||||
|
||||
// runs in engine-shard thread.
|
||||
|
@ -1541,7 +1541,7 @@ void Transaction::LogAutoJournalOnShard(EngineShard* shard, RunnableResult resul
|
|||
}
|
||||
|
||||
// If autojournaling was disabled and not re-enabled, skip it
|
||||
if ((cid_->opt_mask() & CO::NO_AUTOJOURNAL) && !renabled_auto_journal_.load(memory_order_relaxed))
|
||||
if ((cid_->opt_mask() & CO::NO_AUTOJOURNAL) && !re_enabled_auto_journal_)
|
||||
return;
|
||||
|
||||
// TODO: Handle complex commands like LMPOP correctly once they are implemented.
|
||||
|
@ -1586,6 +1586,12 @@ void Transaction::FinishLogJournalOnShard(EngineShard* shard, uint32_t shard_cnt
|
|||
unique_slot_checker_.GetUniqueSlotId(), {}, false);
|
||||
}
|
||||
|
||||
void Transaction::ReviveAutoJournal() {
|
||||
DCHECK(cid_->opt_mask() & CO::NO_AUTOJOURNAL);
|
||||
DCHECK_EQ(run_barrier_.DEBUG_Count(), 0u); // Can't be changed while dispatching
|
||||
re_enabled_auto_journal_ = true;
|
||||
}
|
||||
|
||||
void Transaction::CancelBlocking(std::function<OpStatus(ArgSlice)> status_cb) {
|
||||
// We're on the owning thread of this transaction, so we can safely access it's data below.
|
||||
// First, check if it makes sense to proceed.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue