]> git.proxmox.com Git - ceph.git/blob - ceph/src/rocksdb/utilities/transactions/lock/lock_manager.h
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / rocksdb / utilities / transactions / lock / lock_manager.h
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).
5
6 #pragma once
7 #ifndef ROCKSDB_LITE
8
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"
14
15 namespace ROCKSDB_NAMESPACE {
16
17 class PessimisticTransactionDB;
18
19 class LockManager {
20 public:
21 virtual ~LockManager() {}
22
23 // Whether supports locking a specific key.
24 virtual bool IsPointLockSupported() const = 0;
25
26 // Whether supports locking a range of keys.
27 virtual bool IsRangeLockSupported() const = 0;
28
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;
32
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;
36
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;
40
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;
50
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,
54 Env* env) = 0;
55 virtual void UnLock(PessimisticTransaction* txn,
56 ColumnFamilyId column_family_id, const std::string& key,
57 Env* env) = 0;
58 virtual void UnLock(PessimisticTransaction* txn,
59 ColumnFamilyId column_family_id, const Endpoint& start,
60 const Endpoint& end, Env* env) = 0;
61
62 using PointLockStatus = std::unordered_multimap<ColumnFamilyId, KeyLockInfo>;
63 virtual PointLockStatus GetPointLockStatus() = 0;
64
65 using RangeLockStatus =
66 std::unordered_multimap<ColumnFamilyId, RangeLockInfo>;
67 virtual RangeLockStatus GetRangeLockStatus() = 0;
68
69 virtual std::vector<DeadlockPath> GetDeadlockInfoBuffer() = 0;
70
71 virtual void Resize(uint32_t new_size) = 0;
72 };
73
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);
79
80 } // namespace ROCKSDB_NAMESPACE
81
82 #endif // ROCKSDB_LITE