1 // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2 // This source code is licensed under the BSD-style license found in the
3 // LICENSE file in the root directory of this source tree. An additional grant
4 // of patent rights can be found in the PATENTS file in the same directory.
12 #include <unordered_map>
15 #include "rocksdb/db.h"
16 #include "rocksdb/options.h"
17 #include "rocksdb/utilities/transaction_db.h"
18 #include "utilities/transactions/transaction_impl.h"
19 #include "utilities/transactions/transaction_lock_mgr.h"
23 class TransactionDBImpl
: public TransactionDB
{
25 explicit TransactionDBImpl(DB
* db
,
26 const TransactionDBOptions
& txn_db_options
);
28 explicit TransactionDBImpl(StackableDB
* db
,
29 const TransactionDBOptions
& txn_db_options
);
33 Status
Initialize(const std::vector
<size_t>& compaction_enabled_cf_indices
,
34 const std::vector
<ColumnFamilyHandle
*>& handles
);
36 Transaction
* BeginTransaction(const WriteOptions
& write_options
,
37 const TransactionOptions
& txn_options
,
38 Transaction
* old_txn
) override
;
40 using StackableDB::Put
;
41 virtual Status
Put(const WriteOptions
& options
,
42 ColumnFamilyHandle
* column_family
, const Slice
& key
,
43 const Slice
& val
) override
;
45 using StackableDB::Delete
;
46 virtual Status
Delete(const WriteOptions
& wopts
,
47 ColumnFamilyHandle
* column_family
,
48 const Slice
& key
) override
;
50 using StackableDB::Merge
;
51 virtual Status
Merge(const WriteOptions
& options
,
52 ColumnFamilyHandle
* column_family
, const Slice
& key
,
53 const Slice
& value
) override
;
55 using StackableDB::Write
;
56 virtual Status
Write(const WriteOptions
& opts
, WriteBatch
* updates
) override
;
58 using StackableDB::CreateColumnFamily
;
59 virtual Status
CreateColumnFamily(const ColumnFamilyOptions
& options
,
60 const std::string
& column_family_name
,
61 ColumnFamilyHandle
** handle
) override
;
63 using StackableDB::DropColumnFamily
;
64 virtual Status
DropColumnFamily(ColumnFamilyHandle
* column_family
) override
;
66 Status
TryLock(TransactionImpl
* txn
, uint32_t cfh_id
, const std::string
& key
,
69 void UnLock(TransactionImpl
* txn
, const TransactionKeyMap
* keys
);
70 void UnLock(TransactionImpl
* txn
, uint32_t cfh_id
, const std::string
& key
);
72 void AddColumnFamily(const ColumnFamilyHandle
* handle
);
74 static TransactionDBOptions
ValidateTxnDBOptions(
75 const TransactionDBOptions
& txn_db_options
);
77 const TransactionDBOptions
& GetTxnDBOptions() const {
78 return txn_db_options_
;
81 void InsertExpirableTransaction(TransactionID tx_id
, TransactionImpl
* tx
);
82 void RemoveExpirableTransaction(TransactionID tx_id
);
84 // If transaction is no longer available, locks can be stolen
85 // If transaction is available, try stealing locks directly from transaction
86 // It is the caller's responsibility to ensure that the referred transaction
87 // is expirable (GetExpirationTime() > 0) and that it is expired.
88 bool TryStealingExpiredTransactionLocks(TransactionID tx_id
);
90 Transaction
* GetTransactionByName(const TransactionName
& name
) override
;
92 void RegisterTransaction(Transaction
* txn
);
93 void UnregisterTransaction(Transaction
* txn
);
95 // not thread safe. current use case is during recovery (single thread)
96 void GetAllPreparedTransactions(std::vector
<Transaction
*>* trans
) override
;
98 TransactionLockMgr::LockStatusData
GetLockStatusData() override
;
101 void ReinitializeTransaction(
102 Transaction
* txn
, const WriteOptions
& write_options
,
103 const TransactionOptions
& txn_options
= TransactionOptions());
106 const TransactionDBOptions txn_db_options_
;
107 TransactionLockMgr lock_mgr_
;
109 // Must be held when adding/dropping column families.
110 InstrumentedMutex column_family_mutex_
;
111 Transaction
* BeginInternalTransaction(const WriteOptions
& options
);
112 Status
WriteHelper(WriteBatch
* updates
, TransactionImpl
* txn_impl
);
114 // Used to ensure that no locks are stolen from an expirable transaction
115 // that has started a commit. Only transactions with an expiration time
116 // should be in this map.
117 std::mutex map_mutex_
;
118 std::unordered_map
<TransactionID
, TransactionImpl
*>
119 expirable_transactions_map_
;
121 // map from name to two phase transaction instance
122 std::mutex name_map_mutex_
;
123 std::unordered_map
<TransactionName
, Transaction
*> transactions_
;
126 } // namespace rocksdb
127 #endif // ROCKSDB_LITE