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