]> git.proxmox.com Git - ceph.git/blob - ceph/src/rocksdb/utilities/transactions/optimistic_transaction.h
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / rocksdb / utilities / transactions / optimistic_transaction.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
8 #ifndef ROCKSDB_LITE
9
10 #include <stack>
11 #include <string>
12 #include <unordered_map>
13 #include <vector>
14
15 #include "db/write_callback.h"
16 #include "rocksdb/db.h"
17 #include "rocksdb/slice.h"
18 #include "rocksdb/snapshot.h"
19 #include "rocksdb/status.h"
20 #include "rocksdb/types.h"
21 #include "rocksdb/utilities/transaction.h"
22 #include "rocksdb/utilities/optimistic_transaction_db.h"
23 #include "rocksdb/utilities/write_batch_with_index.h"
24 #include "utilities/transactions/transaction_base.h"
25 #include "utilities/transactions/transaction_util.h"
26
27 namespace rocksdb {
28
29 class OptimisticTransaction : public TransactionBaseImpl {
30 public:
31 OptimisticTransaction(OptimisticTransactionDB* db,
32 const WriteOptions& write_options,
33 const OptimisticTransactionOptions& txn_options);
34
35 virtual ~OptimisticTransaction();
36
37 void Reinitialize(OptimisticTransactionDB* txn_db,
38 const WriteOptions& write_options,
39 const OptimisticTransactionOptions& txn_options);
40
41 Status Prepare() override;
42
43 Status Commit() override;
44
45 Status Rollback() override;
46
47 Status SetName(const TransactionName& name) override;
48
49 protected:
50 Status TryLock(ColumnFamilyHandle* column_family, const Slice& key,
51 bool read_only, bool exclusive,
52 bool untracked = false) override;
53
54 private:
55 OptimisticTransactionDB* const txn_db_;
56
57 friend class OptimisticTransactionCallback;
58
59 void Initialize(const OptimisticTransactionOptions& txn_options);
60
61 // Returns OK if it is safe to commit this transaction. Returns Status::Busy
62 // if there are read or write conflicts that would prevent us from committing
63 // OR if we can not determine whether there would be any such conflicts.
64 //
65 // Should only be called on writer thread.
66 Status CheckTransactionForConflicts(DB* db);
67
68 void Clear() override;
69
70 void UnlockGetForUpdate(ColumnFamilyHandle* /* unused */,
71 const Slice& /* unused */) override {
72 // Nothing to unlock.
73 }
74
75 // No copying allowed
76 OptimisticTransaction(const OptimisticTransaction&);
77 void operator=(const OptimisticTransaction&);
78 };
79
80 // Used at commit time to trigger transaction validation
81 class OptimisticTransactionCallback : public WriteCallback {
82 public:
83 explicit OptimisticTransactionCallback(OptimisticTransaction* txn)
84 : txn_(txn) {}
85
86 Status Callback(DB* db) override {
87 return txn_->CheckTransactionForConflicts(db);
88 }
89
90 bool AllowWriteBatching() override { return false; }
91
92 private:
93 OptimisticTransaction* txn_;
94 };
95
96 } // namespace rocksdb
97
98 #endif // ROCKSDB_LITE