YugabyteDB (2.13.1.0-b60, 21121d69985fbf76aa6958d8f04a9bfa936293b5)

Coverage Report

Created: 2022-03-22 16:43

/Users/deen/code/yugabyte-db/src/yb/tablet/write_query.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_WRITE_QUERY_H
15
#define YB_TABLET_WRITE_QUERY_H
16
17
#include "yb/client/client_fwd.h"
18
19
#include "yb/docdb/docdb_fwd.h"
20
#include "yb/docdb/docdb.h"
21
#include "yb/docdb/doc_operation.h"
22
#include "yb/docdb/lock_batch.h"
23
24
#include "yb/tablet/tablet_fwd.h"
25
26
#include "yb/tserver/tserver.fwd.h"
27
28
#include "yb/util/operation_counter.h"
29
30
namespace yb {
31
namespace tablet {
32
33
class WriteQuery {
34
 public:
35
  WriteQuery(int64_t term,
36
             CoarseTimePoint deadline,
37
             WriteQueryContext* context,
38
             Tablet* tablet,
39
             tserver::WriteResponsePB *response = nullptr,
40
             docdb::OperationKind kind = docdb::OperationKind::kWrite);
41
42
  ~WriteQuery();
43
44
6.73M
  WriteOperation& operation() {
45
6.73M
    return *operation_;
46
6.73M
  }
47
48
  WritePB& request();
49
50
  // Returns the prepared response to the client that will be sent when this
51
  // transaction is completed, if this transaction was started by a client.
52
0
  tserver::WriteResponsePB* response() {
53
0
    return response_;
54
0
  }
55
56
  static void Execute(std::unique_ptr<WriteQuery> query);
57
58
  // The QL write operations that return rowblocks that need to be returned as RPC sidecars
59
  // after the transaction completes.
60
2.47M
  std::vector<std::unique_ptr<docdb::QLWriteOperation>>* ql_write_ops() {
61
2.47M
    return &ql_write_ops_;
62
2.47M
  }
63
64
  // Returns PGSQL write operations.
65
  // TODO(neil) These ops must report number of rows that was updated, deleted, or inserted.
66
3.75M
  std::vector<std::unique_ptr<docdb::PgsqlWriteOperation>>* pgsql_write_ops() {
67
3.75M
    return &pgsql_write_ops_;
68
3.75M
  }
69
70
3.24M
  docdb::OperationKind kind() const {
71
3.24M
    return kind_;
72
3.24M
  }
73
74
  void AdjustYsqlQueryTransactionality(size_t ysql_batch_size);
75
76
2.23M
  HybridTime restart_read_ht() const {
77
2.23M
    return restart_read_ht_;
78
2.23M
  }
79
80
9.63M
  CoarseTimePoint deadline() const {
81
9.63M
    return deadline_;
82
9.63M
  }
83
84
0
  docdb::DocOperations& doc_ops() {
85
0
    return doc_ops_;
86
0
  }
87
88
3.26M
  static void StartSynchronization(std::unique_ptr<WriteQuery> query, const Status& status) {
89
    // We release here, because DoStartSynchronization takes ownership on this.
90
3.26M
    query.release()->DoStartSynchronization(status);
91
3.26M
  }
92
93
3.24M
  void UseSubmitToken(ScopedRWOperation&& token) {
94
3.24M
    submit_token_ = std::move(token);
95
3.24M
  }
96
97
  void set_client_request(std::reference_wrapper<const tserver::WriteRequestPB> req);
98
99
  void set_client_request(std::unique_ptr<tserver::WriteRequestPB> req);
100
101
10.9k
  void set_read_time(const ReadHybridTime& read_time) {
102
10.9k
    read_time_ = read_time;
103
10.9k
  }
104
105
  template <class Callback>
106
3.16M
  void set_callback(Callback&& callback) {
107
3.16M
    callback_ = std::forward<Callback>(callback);
108
3.16M
  }
read_query.cc:void yb::tablet::WriteQuery::set_callback<yb::tserver::(anonymous namespace)::ReadQuery::DoPerform()::$_0>(yb::tserver::(anonymous namespace)::ReadQuery::DoPerform()::$_0&&)
Line
Count
Source
106
314k
  void set_callback(Callback&& callback) {
107
314k
    callback_ = std::forward<Callback>(callback);
108
314k
  }
void yb::tablet::WriteQuery::set_callback<yb::tserver::WriteQueryCompletionCallback>(yb::tserver::WriteQueryCompletionCallback&&)
Line
Count
Source
106
2.56M
  void set_callback(Callback&& callback) {
107
2.56M
    callback_ = std::forward<Callback>(callback);
108
2.56M
  }
void yb::tablet::WriteQuery::set_callback<auto yb::tablet::MakeLatchOperationCompletionCallback<yb::CountDownLatch*, yb::tserver::WriteResponsePB*>(yb::CountDownLatch*, yb::tserver::WriteResponsePB*)::'lambda'(yb::Status const&)>(yb::tserver::WriteResponsePB*&&)
Line
Count
Source
106
4.01k
  void set_callback(Callback&& callback) {
107
4.01k
    callback_ = std::forward<Callback>(callback);
108
4.01k
  }
Unexecuted instantiation: void yb::tablet::WriteQuery::set_callback<void yb::master::MasterSnapshotCoordinator::Impl::CleanupObject<boost::multi_index::multi_index_container<std::__1::unique_ptr<yb::master::SnapshotState, std::__1::default_delete<yb::master::SnapshotState> >, boost::multi_index::indexed_by<boost::multi_index::hashed_unique<boost::multi_index::const_mem_fun<yb::master::SnapshotState, yb::StronglyTypedUuid<yb::TxnSnapshotId_Tag> const&, &(yb::master::SnapshotState::id() const)>, mpl_::na, mpl_::na, mpl_::na>, boost::multi_index::ordered_non_unique<boost::multi_index::tag<yb::master::MasterSnapshotCoordinator::Impl::ScheduleTag, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::multi_index::composite_key<yb::master::SnapshotState, boost::multi_index::const_mem_fun<yb::master::SnapshotState, yb::StronglyTypedUuid<yb::SnapshotScheduleId_Tag> const&, &(yb::master::SnapshotState::schedule_id() const)>, boost::multi_index::const_mem_fun<yb::master::SnapshotState, yb::HybridTime, &(yb::master::SnapshotState::snapshot_hybrid_time() const)>, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::__1::allocator<std::__1::unique_ptr<yb::master::SnapshotState, std::__1::default_delete<yb::master::SnapshotState> > > >, yb::StronglyTypedUuid<yb::TxnSnapshotId_Tag> >(long long, yb::StronglyTypedUuid<yb::TxnSnapshotId_Tag>, boost::multi_index::multi_index_container<std::__1::unique_ptr<yb::master::SnapshotState, std::__1::default_delete<yb::master::SnapshotState> >, boost::multi_index::indexed_by<boost::multi_index::hashed_unique<boost::multi_index::const_mem_fun<yb::master::SnapshotState, yb::StronglyTypedUuid<yb::TxnSnapshotId_Tag> const&, &(yb::master::SnapshotState::id() const)>, mpl_::na, mpl_::na, mpl_::na>, boost::multi_index::ordered_non_unique<boost::multi_index::tag<yb::master::MasterSnapshotCoordinator::Impl::ScheduleTag, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::multi_index::composite_key<yb::master::SnapshotState, boost::multi_index::const_mem_fun<yb::master::SnapshotState, yb::StronglyTypedUuid<yb::SnapshotScheduleId_Tag> const&, &(yb::master::SnapshotState::schedule_id() const)>, boost::multi_index::const_mem_fun<yb::master::SnapshotState, yb::HybridTime, &(yb::master::SnapshotState::snapshot_hybrid_time() const)>, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::__1::allocator<std::__1::unique_ptr<yb::master::SnapshotState, std::__1::default_delete<yb::master::SnapshotState> > > > const&, yb::Result<yb::docdb::KeyBytes> const&)::'lambda'(yb::Status const&)>(boost::multi_index::multi_index_container<std::__1::unique_ptr<yb::master::SnapshotState, std::__1::default_delete<yb::master::SnapshotState> >, boost::multi_index::indexed_by<boost::multi_index::hashed_unique<boost::multi_index::const_mem_fun<yb::master::SnapshotState, yb::StronglyTypedUuid<yb::TxnSnapshotId_Tag> const&, &(yb::master::SnapshotState::id() const)>, mpl_::na, mpl_::na, mpl_::na>, boost::multi_index::ordered_non_unique<boost::multi_index::tag<yb::master::MasterSnapshotCoordinator::Impl::ScheduleTag, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::multi_index::composite_key<yb::master::SnapshotState, boost::multi_index::const_mem_fun<yb::master::SnapshotState, yb::StronglyTypedUuid<yb::SnapshotScheduleId_Tag> const&, &(yb::master::SnapshotState::schedule_id() const)>, boost::multi_index::const_mem_fun<yb::master::SnapshotState, yb::HybridTime, &(yb::master::SnapshotState::snapshot_hybrid_time() const)>, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::__1::allocator<std::__1::unique_ptr<yb::master::SnapshotState, std::__1::default_delete<yb::master::SnapshotState> > > >&&)
void yb::tablet::WriteQuery::set_callback<std::__1::function<void (yb::Status const&)> >(std::__1::function<void (yb::Status const&)>&&)
Line
Count
Source
106
8
  void set_callback(Callback&& callback) {
107
8
    callback_ = std::forward<Callback>(callback);
108
8
  }
Unexecuted instantiation: void yb::tablet::WriteQuery::set_callback<void yb::master::MasterSnapshotCoordinator::Impl::CleanupObject<boost::multi_index::multi_index_container<std::__1::unique_ptr<yb::master::SnapshotScheduleState, std::__1::default_delete<yb::master::SnapshotScheduleState> >, boost::multi_index::indexed_by<boost::multi_index::hashed_unique<boost::multi_index::const_mem_fun<yb::master::SnapshotScheduleState, yb::StronglyTypedUuid<yb::SnapshotScheduleId_Tag> const&, &(yb::master::SnapshotScheduleState::id() const)>, mpl_::na, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::__1::allocator<std::__1::unique_ptr<yb::master::SnapshotScheduleState, std::__1::default_delete<yb::master::SnapshotScheduleState> > > >, yb::StronglyTypedUuid<yb::SnapshotScheduleId_Tag> >(long long, yb::StronglyTypedUuid<yb::SnapshotScheduleId_Tag>, boost::multi_index::multi_index_container<std::__1::unique_ptr<yb::master::SnapshotScheduleState, std::__1::default_delete<yb::master::SnapshotScheduleState> >, boost::multi_index::indexed_by<boost::multi_index::hashed_unique<boost::multi_index::const_mem_fun<yb::master::SnapshotScheduleState, yb::StronglyTypedUuid<yb::SnapshotScheduleId_Tag> const&, &(yb::master::SnapshotScheduleState::id() const)>, mpl_::na, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::__1::allocator<std::__1::unique_ptr<yb::master::SnapshotScheduleState, std::__1::default_delete<yb::master::SnapshotScheduleState> > > > const&, yb::Result<yb::docdb::KeyBytes> const&)::'lambda'(yb::Status const&)>(boost::multi_index::multi_index_container<std::__1::unique_ptr<yb::master::SnapshotScheduleState, std::__1::default_delete<yb::master::SnapshotScheduleState> >, boost::multi_index::indexed_by<boost::multi_index::hashed_unique<boost::multi_index::const_mem_fun<yb::master::SnapshotScheduleState, yb::StronglyTypedUuid<yb::SnapshotScheduleId_Tag> const&, &(yb::master::SnapshotScheduleState::id() const)>, mpl_::na, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::__1::allocator<std::__1::unique_ptr<yb::master::SnapshotScheduleState, std::__1::default_delete<yb::master::SnapshotScheduleState> > > >&&)
void yb::tablet::WriteQuery::set_callback<auto yb::tablet::MakeLatchOperationCompletionCallback<std::__1::shared_ptr<yb::CountDownLatch>, std::__1::shared_ptr<yb::tserver::WriteResponsePB> >(std::__1::shared_ptr<yb::CountDownLatch>, std::__1::shared_ptr<yb::tserver::WriteResponsePB>)::'lambda'(yb::Status const&)>(std::__1::shared_ptr<yb::tserver::WriteResponsePB>&&)
Line
Count
Source
106
285k
  void set_callback(Callback&& callback) {
107
285k
    callback_ = std::forward<Callback>(callback);
108
285k
  }
109
110
  // Cancel query even before sending underlying operation to the Raft.
111
  void Cancel(const Status& status);
112
113
0
  const ReadHybridTime& read_time() const {
114
0
    return read_time_;
115
0
  }
116
117
1
  const tserver::WriteRequestPB* client_request() {
118
1
    return client_request_;
119
1
  }
120
121
  std::unique_ptr<WriteOperation> PrepareSubmit();
122
123
 private:
124
  enum class ExecuteMode;
125
126
  // Actually starts the Mvcc transaction and assigns a hybrid_time to this transaction.
127
  void DoStartSynchronization(const Status& status);
128
129
  void Release();
130
131
  void Finished(WriteOperation* operation, const Status& status);
132
133
  void Complete(const Status& status);
134
135
  CHECKED_STATUS InitExecute(ExecuteMode mode);
136
137
  void ExecuteDone(const Status& status);
138
139
  Result<bool> PrepareExecute();
140
  CHECKED_STATUS DoExecute();
141
142
  void NonTransactionalConflictsResolved(HybridTime now, HybridTime result);
143
144
  void TransactionalConflictsResolved();
145
146
  CHECKED_STATUS DoTransactionalConflictsResolved();
147
148
  void CompleteExecute();
149
150
  CHECKED_STATUS DoCompleteExecute();
151
152
  Result<bool> SimplePrepareExecute();
153
  Result<bool> RedisPrepareExecute();
154
  Result<bool> CqlPrepareExecute();
155
  Result<bool> PgsqlPrepareExecute();
156
157
  void SimpleExecuteDone(const Status& status);
158
  void RedisExecuteDone(const Status& status);
159
  void CqlExecuteDone(const Status& status);
160
  void PgsqlExecuteDone(const Status& status);
161
162
  using IndexOps = std::vector<std::pair<
163
      std::shared_ptr<client::YBqlWriteOp>, docdb::QLWriteOperation*>>;
164
  void UpdateQLIndexes();
165
  void UpdateQLIndexesFlushed(
166
      const client::YBSessionPtr& session, const client::YBTransactionPtr& txn,
167
      const IndexOps& index_ops, client::FlushStatus* flush_status);
168
169
  void CompleteQLWriteBatch(const Status& status);
170
171
  Tablet& tablet() const;
172
173
  std::unique_ptr<WriteOperation> operation_;
174
175
  // The QL write operations that return rowblocks that need to be returned as RPC sidecars
176
  // after the operation completes.
177
  std::vector<std::unique_ptr<docdb::QLWriteOperation>> ql_write_ops_;
178
179
  // The PGSQL write operations that return rowblocks that need to be returned as RPC sidecars
180
  // after the transaction completes.
181
  std::vector<std::unique_ptr<docdb::PgsqlWriteOperation>> pgsql_write_ops_;
182
183
  // Store the ids that have been locked for DocDB operation. They need to be released on commit
184
  // or if an error happens.
185
  docdb::LockBatch docdb_locks_;
186
187
  // True if we know that this operation is on a transactional table so make sure we go through the
188
  // transactional codepath.
189
  bool force_txn_path_ = false;
190
191
  const int64_t term_;
192
  ScopedRWOperation submit_token_;
193
  const CoarseTimePoint deadline_;
194
  WriteQueryContext* const context_;
195
196
  // Pointers to the rpc context, request and response, lifecycle
197
  // is managed by the rpc subsystem. These pointers maybe nullptr if the
198
  // operation was not initiated by an RPC call.
199
  const tserver::WriteRequestPB* client_request_ = nullptr;
200
  ReadHybridTime read_time_;
201
  bool allow_immediate_read_restart_ = false;
202
  std::unique_ptr<tserver::WriteRequestPB> client_request_holder_;
203
  tserver::WriteResponsePB* response_;
204
205
  docdb::OperationKind kind_;
206
207
  // this transaction's start time
208
  CoarseTimePoint start_time_;
209
210
  HybridTime restart_read_ht_;
211
212
  docdb::DocOperations doc_ops_;
213
214
  std::function<void(const Status&)> callback_;
215
216
  ScopedRWOperation scoped_read_operation_;
217
  ExecuteMode execute_mode_;
218
  IsolationLevel isolation_level_;
219
  docdb::PrepareDocWriteOperationResult prepare_result_;
220
  RequestScope request_scope_;
221
  std::unique_ptr<WriteQuery> self_; // Keep self while Execute is performed.
222
};
223
224
}  // namespace tablet
225
}  // namespace yb
226
227
#endif  // YB_TABLET_WRITE_QUERY_H