void TransactionImpl::Initialize(const TransactionOptions& txn_options) {
txn_id_ = GenTxnID();
- exec_status_ = STARTED;
+ txn_state_ = STARTED;
lock_timeout_ = txn_options.lock_timeout * 1000;
if (lock_timeout_ < 0) {
if (expiration_time_ > 0) {
txn_db_impl_->RemoveExpirableTransaction(txn_id_);
}
- if (!name_.empty() && exec_status_ != COMMITED) {
+ if (!name_.empty() && txn_state_ != COMMITED) {
txn_db_impl_->UnregisterTransaction(this);
}
}
void TransactionImpl::Reinitialize(TransactionDB* txn_db,
const WriteOptions& write_options,
const TransactionOptions& txn_options) {
- if (!name_.empty() && exec_status_ != COMMITED) {
+ if (!name_.empty() && txn_state_ != COMMITED) {
txn_db_impl_->UnregisterTransaction(this);
}
TransactionBaseImpl::Reinitialize(txn_db->GetRootDB(), write_options);
if (IsExpired()) {
s = Status::Expired();
} else if (expiration_time_ > 0) {
- ExecutionStatus expected = STARTED;
- can_commit = std::atomic_compare_exchange_strong(&exec_status_, &expected,
+ TransactionState expected = STARTED;
+ can_commit = std::atomic_compare_exchange_strong(&txn_state_, &expected,
AWAITING_COMMIT);
- } else if (exec_status_ == STARTED) {
+ } else if (txn_state_ == STARTED) {
// lock stealing is not a concern
can_commit = true;
}
if (can_commit) {
- exec_status_.store(AWAITING_COMMIT);
+ txn_state_.store(AWAITING_COMMIT);
s = db_->Write(write_options_, batch);
if (s.ok()) {
- exec_status_.store(COMMITED);
+ txn_state_.store(COMMITED);
}
- } else if (exec_status_ == LOCKS_STOLEN) {
+ } else if (txn_state_ == LOCKS_STOLEN) {
s = Status::Expired();
} else {
s = Status::InvalidArgument("Transaction is not in state for commit.");
if (expiration_time_ > 0) {
// must concern ourselves with expiraton and/or lock stealing
// need to compare/exchange bc locks could be stolen under us here
- ExecutionStatus expected = STARTED;
- can_prepare = std::atomic_compare_exchange_strong(&exec_status_, &expected,
+ TransactionState expected = STARTED;
+ can_prepare = std::atomic_compare_exchange_strong(&txn_state_, &expected,
AWAITING_PREPARE);
- } else if (exec_status_ == STARTED) {
+ } else if (txn_state_ == STARTED) {
// expiration and lock stealing is not possible
can_prepare = true;
}
if (can_prepare) {
- exec_status_.store(AWAITING_PREPARE);
+ txn_state_.store(AWAITING_PREPARE);
// transaction can't expire after preparation
expiration_time_ = 0;
WriteOptions write_options = write_options_;
if (s.ok()) {
assert(log_number_ != 0);
dbimpl_->MarkLogAsContainingPrepSection(log_number_);
- exec_status_.store(PREPARED);
+ txn_state_.store(PREPARED);
}
- } else if (exec_status_ == LOCKS_STOLEN) {
+ } else if (txn_state_ == LOCKS_STOLEN) {
s = Status::Expired();
- } else if (exec_status_ == PREPARED) {
+ } else if (txn_state_ == PREPARED) {
s = Status::InvalidArgument("Transaction has already been prepared.");
- } else if (exec_status_ == COMMITED) {
+ } else if (txn_state_ == COMMITED) {
s = Status::InvalidArgument("Transaction has already been committed.");
- } else if (exec_status_ == ROLLEDBACK) {
+ } else if (txn_state_ == ROLLEDBACK) {
s = Status::InvalidArgument("Transaction has already been rolledback.");
} else {
s = Status::InvalidArgument("Transaction is not in state for commit.");
// to change our state out from under us in the even that we expire and have
// our locks stolen. In this case the only valid state is STARTED because
// a state of PREPARED would have a cleared expiration_time_.
- ExecutionStatus expected = STARTED;
- commit_single = std::atomic_compare_exchange_strong(
- &exec_status_, &expected, AWAITING_COMMIT);
+ TransactionState expected = STARTED;
+ commit_single = std::atomic_compare_exchange_strong(&txn_state_, &expected,
+ AWAITING_COMMIT);
TEST_SYNC_POINT("TransactionTest::ExpirableTransactionDataRace:1");
- } else if (exec_status_ == PREPARED) {
+ } else if (txn_state_ == PREPARED) {
// expiration and lock stealing is not a concern
commit_prepared = true;
- } else if (exec_status_ == STARTED) {
+ } else if (txn_state_ == STARTED) {
// expiration and lock stealing is not a concern
commit_single = true;
}
s = Status::InvalidArgument(
"Commit-time batch contains values that will not be committed.");
} else {
- exec_status_.store(AWAITING_COMMIT);
+ txn_state_.store(AWAITING_COMMIT);
s = db_->Write(write_options_, GetWriteBatch()->GetWriteBatch());
Clear();
if (s.ok()) {
- exec_status_.store(COMMITED);
+ txn_state_.store(COMMITED);
}
}
} else if (commit_prepared) {
- exec_status_.store(AWAITING_COMMIT);
-
+ txn_state_.store(AWAITING_COMMIT);
// We take the commit-time batch and append the Commit marker.
// The Memtable will ignore the Commit marker in non-recovery mode
txn_db_impl_->UnregisterTransaction(this);
Clear();
- exec_status_.store(COMMITED);
- } else if (exec_status_ == LOCKS_STOLEN) {
+ txn_state_.store(COMMITED);
+ } else if (txn_state_ == LOCKS_STOLEN) {
s = Status::Expired();
- } else if (exec_status_ == COMMITED) {
+ } else if (txn_state_ == COMMITED) {
s = Status::InvalidArgument("Transaction has already been committed.");
- } else if (exec_status_ == ROLLEDBACK) {
+ } else if (txn_state_ == ROLLEDBACK) {
s = Status::InvalidArgument("Transaction has already been rolledback.");
} else {
s = Status::InvalidArgument("Transaction is not in state for commit.");
Status TransactionImpl::Rollback() {
Status s;
- if (exec_status_ == PREPARED) {
+ if (txn_state_ == PREPARED) {
WriteBatch rollback_marker;
WriteBatchInternal::MarkRollback(&rollback_marker, name_);
- exec_status_.store(AWAITING_ROLLBACK);
+ txn_state_.store(AWAITING_ROLLBACK);
s = db_impl_->WriteImpl(write_options_, &rollback_marker);
if (s.ok()) {
// we do not need to keep our prepared section around
assert(log_number_ > 0);
dbimpl_->MarkLogAsHavingPrepSectionFlushed(log_number_);
Clear();
- exec_status_.store(ROLLEDBACK);
+ txn_state_.store(ROLLEDBACK);
}
- } else if (exec_status_ == STARTED) {
+ } else if (txn_state_ == STARTED) {
// prepare couldn't have taken place
Clear();
- } else if (exec_status_ == COMMITED) {
+ } else if (txn_state_ == COMMITED) {
s = Status::InvalidArgument("This transaction has already been committed.");
} else {
s = Status::InvalidArgument(
}
Status TransactionImpl::RollbackToSavePoint() {
- if (exec_status_ != STARTED) {
+ if (txn_state_ != STARTED) {
return Status::InvalidArgument("Transaction is beyond state for rollback.");
}
bool TransactionImpl::TryStealingLocks() {
assert(IsExpired());
- ExecutionStatus expected = STARTED;
- return std::atomic_compare_exchange_strong(&exec_status_, &expected,
+ TransactionState expected = STARTED;
+ return std::atomic_compare_exchange_strong(&txn_state_, &expected,
LOCKS_STOLEN);
}
Status TransactionImpl::SetName(const TransactionName& name) {
Status s;
- if (exec_status_ == STARTED) {
+ if (txn_state_ == STARTED) {
if (name_.length()) {
s = Status::InvalidArgument("Transaction has already been named.");
} else if (txn_db_impl_->GetTransactionByName(name) != nullptr) {