Kuzu C++ API
Loading...
Searching...
No Matches
transaction.h
Go to the documentation of this file.
1#pragma once
2
3#include <atomic>
4#include <mutex>
5
6#include "types.h"
7
8namespace kuzu {
9namespace binder {
10struct BoundAlterInfo;
11}
12namespace catalog {
13class CatalogEntry;
14class CatalogSet;
15class SequenceCatalogEntry;
16struct SequenceRollbackData;
17} // namespace catalog
18namespace main {
19class ClientContext;
20} // namespace main
21namespace storage {
22class LocalWAL;
23class LocalStorage;
24class UndoBuffer;
25class WAL;
26class VersionInfo;
27class UpdateInfo;
28struct VectorUpdateInfo;
29class ChunkedNodeGroup;
30class VersionRecordHandler;
31} // namespace storage
32namespace transaction {
33class TransactionManager;
34
36
37class LocalCacheManager;
39public:
40 explicit LocalCacheObject(std::string key) : key{std::move(key)} {}
41
42 virtual ~LocalCacheObject() = default;
43
44 std::string getKey() const { return key; }
45
46 template<typename T>
47 T* cast() {
48 return common::ku_dynamic_cast<T*>(this);
49 }
50
51private:
52 std::string key;
53};
54
56public:
57 bool contains(const std::string& key) {
58 std::unique_lock lck{mtx};
59 return cachedObjects.contains(key);
60 }
61 LocalCacheObject& at(const std::string& key) {
62 std::unique_lock lck{mtx};
63 return *cachedObjects.at(key);
64 }
65 bool put(std::unique_ptr<LocalCacheObject> object);
66
67 void remove(const std::string& key) {
68 std::unique_lock lck{mtx};
69 cachedObjects.erase(key);
70 }
71
72private:
73 std::unordered_map<std::string, std::unique_ptr<LocalCacheObject>> cachedObjects;
74 std::mutex mtx;
75};
76
78 friend class TransactionManager;
79
80public:
84 static_cast<common::transaction_t>(1) << 63;
85
86 Transaction(main::ClientContext& clientContext, TransactionType transactionType,
87 common::transaction_t transactionID, common::transaction_t startTS);
88
89 explicit Transaction(TransactionType transactionType) noexcept;
91 common::transaction_t startTS) noexcept;
92
94
95 TransactionType getType() const { return type; }
96 bool isReadOnly() const { return TransactionType::READ_ONLY == type; }
97 bool isWriteTransaction() const { return TransactionType::WRITE == type; }
98 bool isDummy() const { return TransactionType::DUMMY == type; }
99 bool isRecovery() const { return TransactionType::RECOVERY == type; }
100 common::transaction_t getID() const { return ID; }
101 common::transaction_t getStartTS() const { return startTS; }
102 common::transaction_t getCommitTS() const { return commitTS; }
103 int64_t getCurrentTS() const { return currentTS; }
104
105 void setForceCheckpoint() { forceCheckpoint = true; }
107 // Only write transactions and recovery transactions should append to the undo buffer.
108 return isWriteTransaction() || isRecovery();
109 }
110 bool shouldLogToWAL() const;
111 storage::LocalWAL& getLocalWAL() const {
112 KU_ASSERT(localWAL);
113 return *localWAL;
114 }
115
117
118 void commit(storage::WAL* wal);
119 void rollback(storage::WAL* wal);
120
121 storage::LocalStorage* getLocalStorage() const { return localStorage.get(); }
122 LocalCacheManager& getLocalCacheManager() { return localCacheManager; }
123 bool isUnCommitted(common::table_id_t tableID, common::offset_t nodeOffset) const;
125 common::offset_t nodeOffset) const {
126 return nodeOffset - getMinUncommittedNodeOffset(tableID);
127 }
129 common::row_idx_t localRowIdx) const {
130 return getMinUncommittedNodeOffset(tableID) + localRowIdx;
131 }
132
133 void pushCreateDropCatalogEntry(catalog::CatalogSet& catalogSet,
134 catalog::CatalogEntry& catalogEntry, bool isInternal, bool skipLoggingToWAL = false);
135 void pushAlterCatalogEntry(catalog::CatalogSet& catalogSet, catalog::CatalogEntry& catalogEntry,
136 const binder::BoundAlterInfo& alterInfo);
137 void pushSequenceChange(catalog::SequenceCatalogEntry* sequenceEntry, int64_t kCount,
138 const catalog::SequenceRollbackData& data);
140 common::row_idx_t numRows, const storage::VersionRecordHandler* versionRecordHandler) const;
142 common::row_idx_t numRows, const storage::VersionRecordHandler* versionRecordHandler) const;
143 void pushVectorUpdateInfo(storage::UpdateInfo& updateInfo, common::idx_t vectorIdx,
144 storage::VectorUpdateInfo& vectorUpdateInfo) const;
145
146private:
147 common::offset_t getMinUncommittedNodeOffset(common::table_id_t tableID) const;
148
149private:
150 TransactionType type;
152 common::transaction_t startTS;
153 common::transaction_t commitTS;
154 int64_t currentTS;
155 main::ClientContext* clientContext;
156 std::unique_ptr<storage::LocalStorage> localStorage;
157 std::unique_ptr<storage::UndoBuffer> undoBuffer;
158 std::unique_ptr<storage::LocalWAL> localWAL;
159 LocalCacheManager localCacheManager;
160 bool forceCheckpoint;
161 std::atomic<bool> hasCatalogChanges;
162};
163
164// TODO(bmwinger): These shouldn't need to be exported
167
168} // namespace transaction
169} // namespace kuzu
#define KUZU_API
Definition api.h:25
#define KU_ASSERT(condition)
Definition assert.h:24
Contain client side configuration. We make profiler associated per query, so the profiler is not main...
Definition client_context.h:69
Definition transaction.h:55
void remove(const std::string &key)
Definition transaction.h:67
LocalCacheObject & at(const std::string &key)
Definition transaction.h:61
bool put(std::unique_ptr< LocalCacheObject > object)
bool contains(const std::string &key)
Definition transaction.h:57
Definition transaction.h:38
std::string getKey() const
Definition transaction.h:44
LocalCacheObject(std::string key)
Definition transaction.h:40
T * cast()
Definition transaction.h:47
Definition transaction.h:77
void commit(storage::WAL *wal)
storage::LocalStorage * getLocalStorage() const
Definition transaction.h:121
common::transaction_t getStartTS() const
Definition transaction.h:101
common::row_idx_t getLocalRowIdx(common::table_id_t tableID, common::offset_t nodeOffset) const
Definition transaction.h:124
Transaction(TransactionType transactionType) noexcept
Transaction(main::ClientContext &clientContext, TransactionType transactionType, common::transaction_t transactionID, common::transaction_t startTS)
bool isRecovery() const
Definition transaction.h:99
Transaction(TransactionType transactionType, common::transaction_t ID, common::transaction_t startTS) noexcept
bool isUnCommitted(common::table_id_t tableID, common::offset_t nodeOffset) const
common::transaction_t getCommitTS() const
Definition transaction.h:102
void pushAlterCatalogEntry(catalog::CatalogSet &catalogSet, catalog::CatalogEntry &catalogEntry, const binder::BoundAlterInfo &alterInfo)
bool shouldAppendToUndoBuffer() const
Definition transaction.h:106
bool isWriteTransaction() const
Definition transaction.h:97
static constexpr common::transaction_t DUMMY_TRANSACTION_ID
Definition transaction.h:81
TransactionType getType() const
Definition transaction.h:95
common::offset_t getUncommittedOffset(common::table_id_t tableID, common::row_idx_t localRowIdx) const
Definition transaction.h:128
void pushVectorUpdateInfo(storage::UpdateInfo &updateInfo, common::idx_t vectorIdx, storage::VectorUpdateInfo &vectorUpdateInfo) const
void pushInsertInfo(common::node_group_idx_t nodeGroupIdx, common::row_idx_t startRow, common::row_idx_t numRows, const storage::VersionRecordHandler *versionRecordHandler) const
LocalCacheManager & getLocalCacheManager()
Definition transaction.h:122
storage::LocalWAL & getLocalWAL() const
Definition transaction.h:111
static constexpr common::transaction_t DUMMY_START_TIMESTAMP
Definition transaction.h:82
void pushSequenceChange(catalog::SequenceCatalogEntry *sequenceEntry, int64_t kCount, const catalog::SequenceRollbackData &data)
common::transaction_t getID() const
Definition transaction.h:100
void setForceCheckpoint()
Definition transaction.h:105
friend class TransactionManager
Definition transaction.h:78
bool isReadOnly() const
Definition transaction.h:96
static constexpr common::transaction_t START_TRANSACTION_ID
Definition transaction.h:83
void pushDeleteInfo(common::node_group_idx_t nodeGroupIdx, common::row_idx_t startRow, common::row_idx_t numRows, const storage::VersionRecordHandler *versionRecordHandler) const
void rollback(storage::WAL *wal)
void pushCreateDropCatalogEntry(catalog::CatalogSet &catalogSet, catalog::CatalogEntry &catalogEntry, bool isInternal, bool skipLoggingToWAL=false)
int64_t getCurrentTS() const
Definition transaction.h:103
bool isDummy() const
Definition transaction.h:98
Definition bind_input.h:12
Definition database.h:21
uint32_t idx_t
Definition types.h:45
uint64_t node_group_idx_t
Definition types.h:55
uint64_t transaction_t
Definition types.h:66
oid_t table_id_t
Definition types.h:72
uint64_t offset_t
Definition types.h:79
uint64_t row_idx_t
Definition types.h:52
TO ku_dynamic_cast(FROM *old)
Definition cast.h:11
Definition bind_input.h:16
Definition copy_from_error.h:17
Definition kuzu_fwd.h:56
TransactionType
Definition transaction.h:35
@ CHECKPOINT
Definition transaction.h:35
@ READ_ONLY
Definition transaction.h:35
@ RECOVERY
Definition transaction.h:35
@ DUMMY
Definition transaction.h:35
@ WRITE
Definition transaction.h:35
KUZU_API Transaction DUMMY_CHECKPOINT_TRANSACTION
KUZU_API Transaction DUMMY_TRANSACTION
Definition array_utils.h:7