/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 |