#pragma once
#include <memory>
#include <mutex>
#include "common/constants.h"
#include "common/uniq_lock.h"
#include "storage/checkpointer.h"
#include "storage/wal/wal.h"
#include "transaction/transaction.h"
namespace lbug {
namespace main {
class ClientContext;
}
namespace testing {
class DBTest;
class FlakyBufferManager;
class FlakyCheckpointer;
}
namespace transaction {
class TransactionManager {
friend class testing::DBTest;
friend class testing::FlakyBufferManager;
friend class testing::FlakyCheckpointer;
using init_checkpointer_func_t =
std::function<std::unique_ptr<storage::Checkpointer>(main::ClientContext&)>;
static std::unique_ptr<storage::Checkpointer> initCheckpointer(
main::ClientContext& clientContext);
public:
explicit TransactionManager(storage::WAL& wal)
: wal{wal}, lastTransactionID{Transaction::START_TRANSACTION_ID}, lastTimestamp{1} {
initCheckpointerFunc = initCheckpointer;
}
Transaction* beginTransaction(main::ClientContext& clientContext, TransactionType type);
void commit(main::ClientContext& clientContext, Transaction* transaction);
void rollback(main::ClientContext& clientContext, Transaction* transaction);
void checkpoint(main::ClientContext& clientContext);
static TransactionManager* Get(const main::ClientContext& context);
private:
bool hasNoActiveTransactions() const;
void checkpointNoLock(main::ClientContext& clientContext);
void tryCheckpoint(main::ClientContext& clientContext);
common::UniqLock stopNewTransactionsAndWaitUntilAllTransactionsLeave();
common::UniqLock stopNewWriteTransactionsAndWaitUntilAllWriteTransactionsLeave();
bool hasActiveWriteTransactionNoLock() const {
return activeWriteTransactionCount.load(std::memory_order_acquire) > 0;
}
void setCheckPointWaitTimeoutForTransactionsToLeaveInMicros(uint64_t waitTimeInMicros) {
checkpointWaitTimeoutInMicros = waitTimeInMicros;
}
void clearTransactionNoLock(common::transaction_t transactionID);
private:
storage::WAL& wal;
std::vector<std::unique_ptr<Transaction>> activeTransactions;
common::transaction_t lastTransactionID;
common::transaction_t lastTimestamp;
std::mutex mtxForSerializingPublicFunctionCalls;
std::mutex mtxForStartingNewTransactions;
std::mutex mtxForCheckpoint;
std::atomic<uint32_t> activeWriteTransactionCount{0};
uint64_t checkpointWaitTimeoutInMicros = common::DEFAULT_CHECKPOINT_WAIT_TIMEOUT_IN_MICROS;
init_checkpointer_func_t initCheckpointerFunc;
};
} }