/Users/deen/code/yugabyte-db/src/yb/tablet/running_transaction.h
Line | Count | Source (jump to first uncovered line) |
1 | | // Copyright (c) YugaByte, Inc. |
2 | | // |
3 | | // Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except |
4 | | // in compliance with the License. You may obtain a copy of the License at |
5 | | // |
6 | | // http://www.apache.org/licenses/LICENSE-2.0 |
7 | | // |
8 | | // Unless required by applicable law or agreed to in writing, software distributed under the License |
9 | | // is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
10 | | // or implied. See the License for the specific language governing permissions and limitations |
11 | | // under the License. |
12 | | // |
13 | | |
14 | | #ifndef YB_TABLET_RUNNING_TRANSACTION_H |
15 | | #define YB_TABLET_RUNNING_TRANSACTION_H |
16 | | |
17 | | #include <memory> |
18 | | |
19 | | #include "yb/client/client_fwd.h" |
20 | | #include "yb/docdb/docdb.h" |
21 | | |
22 | | #include "yb/tablet/apply_intents_task.h" |
23 | | #include "yb/tablet/remove_intents_task.h" |
24 | | #include "yb/tablet/transaction_participant.h" |
25 | | |
26 | | #include "yb/tserver/tserver_fwd.h" |
27 | | |
28 | | #include "yb/util/bitmap.h" |
29 | | #include "yb/util/operation_counter.h" |
30 | | |
31 | | namespace yb { |
32 | | namespace tablet { |
33 | | |
34 | | YB_DEFINE_ENUM(UpdateAbortCheckHTMode, (kStatusRequestSent)(kStatusResponseReceived)); |
35 | | |
36 | | // Represents transaction running at transaction participant. |
37 | | class RunningTransaction : public std::enable_shared_from_this<RunningTransaction> { |
38 | | public: |
39 | | RunningTransaction(TransactionMetadata metadata, |
40 | | const TransactionalBatchData& last_batch_data, |
41 | | OneWayBitmap&& replicated_batches, |
42 | | HybridTime base_time_for_abort_check_ht_calculation, |
43 | | RunningTransactionContext* context); |
44 | | |
45 | | ~RunningTransaction(); |
46 | | |
47 | 22.3M | const TransactionId& id() const { |
48 | 22.3M | return metadata_.transaction_id; |
49 | 22.3M | } |
50 | | |
51 | 16.6M | HybridTime start_ht() const { |
52 | 16.6M | return metadata_.start_time; |
53 | 16.6M | } |
54 | | |
55 | 6.08M | HybridTime abort_check_ht() const { |
56 | 6.08M | return abort_check_ht_; |
57 | 6.08M | } |
58 | | |
59 | | MUST_USE_RESULT bool UpdateStatus( |
60 | | TransactionStatus transaction_status, HybridTime time_of_status, |
61 | | HybridTime coordinator_safe_time, AbortedSubTransactionSet aborted_subtxn_set); |
62 | | |
63 | | void UpdateAbortCheckHT(HybridTime now, UpdateAbortCheckHTMode mode); |
64 | | |
65 | 3.35M | const TransactionMetadata& metadata() const { |
66 | 3.35M | return metadata_; |
67 | 3.35M | } |
68 | | |
69 | 2.31M | const TransactionalBatchData& last_batch_data() const { |
70 | 2.31M | return last_batch_data_; |
71 | 2.31M | } |
72 | | |
73 | 0 | size_t num_replicated_batches() const { |
74 | 0 | return replicated_batches_.CountSet(); |
75 | 0 | } |
76 | | |
77 | 0 | const OneWayBitmap& replicated_batches() const { |
78 | 0 | return replicated_batches_; |
79 | 0 | } |
80 | | |
81 | 2.18M | HybridTime local_commit_time() const { |
82 | 2.18M | return local_commit_time_; |
83 | 2.18M | } |
84 | | |
85 | 215k | const AbortedSubTransactionSet& local_commit_aborted_subtxn_set() const { |
86 | 215k | return local_commit_aborted_subtxn_set_; |
87 | 215k | } |
88 | | |
89 | | void SetLocalCommitData(HybridTime time, const AbortedSubTransactionSet& aborted_subtxn_set); |
90 | | void AddReplicatedBatch( |
91 | | size_t batch_idx, boost::container::small_vector_base<uint8_t>* encoded_replicated_batches); |
92 | | void BatchReplicated(const TransactionalBatchData& value); |
93 | | void RequestStatusAt(const StatusRequest& request, |
94 | | std::unique_lock<std::mutex>* lock); |
95 | | bool WasAborted() const; |
96 | | CHECKED_STATUS CheckAborted() const; |
97 | | void Aborted(); |
98 | | |
99 | | void Abort(client::YBClient* client, |
100 | | TransactionStatusCallback callback, |
101 | | std::unique_lock<std::mutex>* lock); |
102 | | |
103 | | std::string ToString() const; |
104 | | void ScheduleRemoveIntents(const RunningTransactionPtr& shared_self); |
105 | | |
106 | | // Sets apply state for this transaction. |
107 | | // If data is not null, then apply intents task will be initiated if was not previously started. |
108 | | void SetApplyData(const docdb::ApplyTransactionState& apply_state, |
109 | | const TransactionApplyData* data = nullptr, |
110 | | ScopedRWOperation* operation = nullptr); |
111 | | |
112 | | void SetOpId(const OpId& id); |
113 | | |
114 | 1.91M | OpId GetOpId() { |
115 | 1.91M | return opId; |
116 | 1.91M | } |
117 | | |
118 | | // Whether this transactions is currently applying intents. |
119 | | bool ProcessingApply() const; |
120 | | |
121 | | std::string LogPrefix() const; |
122 | | |
123 | | private: |
124 | | static boost::optional<TransactionStatus> GetStatusAt( |
125 | | HybridTime time, |
126 | | HybridTime last_known_status_hybrid_time, |
127 | | TransactionStatus last_known_status); |
128 | | |
129 | | void SendStatusRequest(int64_t serial_no, const RunningTransactionPtr& shared_self); |
130 | | |
131 | | void StatusReceived(const Status& status, |
132 | | const tserver::GetTransactionStatusResponsePB& response, |
133 | | int64_t serial_no, |
134 | | const RunningTransactionPtr& shared_self); |
135 | | |
136 | | void DoStatusReceived(const Status& status, |
137 | | const tserver::GetTransactionStatusResponsePB& response, |
138 | | int64_t serial_no, |
139 | | const RunningTransactionPtr& shared_self); |
140 | | |
141 | | // Extracts status waiters from status_waiters_ that could be notified at this point. |
142 | | // Extracted waiters also removed from status_waiters_. |
143 | | std::vector<StatusRequest> ExtractFinishedStatusWaitersUnlocked( |
144 | | int64_t serial_no, HybridTime time_of_status, TransactionStatus transaction_status); |
145 | | |
146 | | // Notify provided status waiters. |
147 | | void NotifyWaiters(int64_t serial_no, HybridTime time_of_status, |
148 | | TransactionStatus transaction_status, |
149 | | const AbortedSubTransactionSet& aborted_subtxn_set, |
150 | | const std::vector<StatusRequest>& status_waiters); |
151 | | |
152 | | static Result<TransactionStatusResult> MakeAbortResult( |
153 | | const Status& status, |
154 | | const tserver::AbortTransactionResponsePB& response); |
155 | | |
156 | | void AbortReceived(const Status& status, |
157 | | const tserver::AbortTransactionResponsePB& response, |
158 | | const RunningTransactionPtr& shared_self); |
159 | | |
160 | | TransactionMetadata metadata_; |
161 | | TransactionalBatchData last_batch_data_; |
162 | | OneWayBitmap replicated_batches_; |
163 | | RunningTransactionContext& context_; |
164 | | RemoveIntentsTask remove_intents_task_; |
165 | | HybridTime local_commit_time_ = HybridTime::kInvalid; |
166 | | AbortedSubTransactionSet local_commit_aborted_subtxn_set_; |
167 | | |
168 | | TransactionStatus last_known_status_ = TransactionStatus::CREATED; |
169 | | HybridTime last_known_status_hybrid_time_ = HybridTime::kMin; |
170 | | std::vector<StatusRequest> status_waiters_; |
171 | | rpc::Rpcs::Handle get_status_handle_; |
172 | | rpc::Rpcs::Handle abort_handle_; |
173 | | std::vector<TransactionStatusCallback> abort_waiters_; |
174 | | |
175 | | TransactionApplyData apply_data_; |
176 | | OpId opId; |
177 | | docdb::ApplyTransactionState apply_state_; |
178 | | // Atomic that reflects active state, required to provide concurrent access to ProcessingApply. |
179 | | std::atomic<bool> processing_apply_{false}; |
180 | | ApplyIntentsTask apply_intents_task_; |
181 | | |
182 | | // Time of the next check whether this transaction has been aborted. |
183 | | HybridTime abort_check_ht_; |
184 | | }; |
185 | | |
186 | | CHECKED_STATUS MakeAbortedStatus(const TransactionId& id); |
187 | | |
188 | | } // namespace tablet |
189 | | } // namespace yb |
190 | | |
191 | | #endif // YB_TABLET_RUNNING_TRANSACTION_H |