YugabyteDB (2.13.1.0-b60, 21121d69985fbf76aa6958d8f04a9bfa936293b5)

Coverage Report

Created: 2022-03-22 16:43

/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