1 // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2 // This source code is licensed under both the GPLv2 (found in the
3 // COPYING file in the root directory) and Apache 2.0 License
4 // (found in the LICENSE.Apache file in the root directory).
9 #include "rocksdb/types.h"
10 #include "rocksdb/utilities/transaction.h"
11 #include "rocksdb/utilities/transaction_db.h"
12 #include "utilities/transactions/lock/lock_tracker.h"
13 #include "utilities/transactions/pessimistic_transaction.h"
15 namespace ROCKSDB_NAMESPACE
{
17 class PessimisticTransactionDB
;
21 virtual ~LockManager() {}
23 // Whether supports locking a specific key.
24 virtual bool IsPointLockSupported() const = 0;
26 // Whether supports locking a range of keys.
27 virtual bool IsRangeLockSupported() const = 0;
29 // Locks acquired through this LockManager should be tracked by
30 // the LockTrackers created through the returned factory.
31 virtual const LockTrackerFactory
& GetLockTrackerFactory() const = 0;
33 // Enable locking for the specified column family.
34 // Caller should guarantee that this column family is not already enabled.
35 virtual void AddColumnFamily(const ColumnFamilyHandle
* cf
) = 0;
37 // Disable locking for the specified column family.
38 // Caller should guarantee that this column family is no longer used.
39 virtual void RemoveColumnFamily(const ColumnFamilyHandle
* cf
) = 0;
41 // Attempt to lock a key or a key range. If OK status is returned, the caller
42 // is responsible for calling UnLock() on this key.
43 virtual Status
TryLock(PessimisticTransaction
* txn
,
44 ColumnFamilyId column_family_id
,
45 const std::string
& key
, Env
* env
, bool exclusive
) = 0;
46 // The range [start, end] are inclusive at both sides.
47 virtual Status
TryLock(PessimisticTransaction
* txn
,
48 ColumnFamilyId column_family_id
, const Endpoint
& start
,
49 const Endpoint
& end
, Env
* env
, bool exclusive
) = 0;
51 // Unlock a key or a range locked by TryLock(). txn must be the same
52 // Transaction that locked this key.
53 virtual void UnLock(PessimisticTransaction
* txn
, const LockTracker
& tracker
,
55 virtual void UnLock(PessimisticTransaction
* txn
,
56 ColumnFamilyId column_family_id
, const std::string
& key
,
58 virtual void UnLock(PessimisticTransaction
* txn
,
59 ColumnFamilyId column_family_id
, const Endpoint
& start
,
60 const Endpoint
& end
, Env
* env
) = 0;
62 using PointLockStatus
= std::unordered_multimap
<ColumnFamilyId
, KeyLockInfo
>;
63 virtual PointLockStatus
GetPointLockStatus() = 0;
65 using RangeLockStatus
=
66 std::unordered_multimap
<ColumnFamilyId
, RangeLockInfo
>;
67 virtual RangeLockStatus
GetRangeLockStatus() = 0;
69 virtual std::vector
<DeadlockPath
> GetDeadlockInfoBuffer() = 0;
71 virtual void Resize(uint32_t new_size
) = 0;
74 // LockManager should always be constructed through this factory method,
75 // instead of constructing through concrete implementations' constructor.
76 // Caller owns the returned pointer.
77 std::shared_ptr
<LockManager
> NewLockManager(PessimisticTransactionDB
* db
,
78 const TransactionDBOptions
& opt
);
80 } // namespace ROCKSDB_NAMESPACE
82 #endif // ROCKSDB_LITE