/Users/deen/code/yugabyte-db/src/yb/tserver/pg_client_service.cc
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 | | #include "yb/tserver/pg_client_service.h" |
15 | | |
16 | | #include <queue> |
17 | | #include <shared_mutex> |
18 | | |
19 | | #include <boost/multi_index/hashed_index.hpp> |
20 | | #include <boost/multi_index/mem_fun.hpp> |
21 | | #include <boost/multi_index/ordered_index.hpp> |
22 | | #include <boost/multi_index_container.hpp> |
23 | | |
24 | | #include "yb/client/client.h" |
25 | | #include "yb/client/schema.h" |
26 | | #include "yb/client/table.h" |
27 | | #include "yb/client/table_creator.h" |
28 | | #include "yb/client/tablet_server.h" |
29 | | |
30 | | #include "yb/common/partition.h" |
31 | | #include "yb/common/pg_types.h" |
32 | | #include "yb/common/wire_protocol.h" |
33 | | |
34 | | #include "yb/master/master_admin.proxy.h" |
35 | | |
36 | | #include "yb/rpc/rpc_context.h" |
37 | | #include "yb/rpc/rpc_controller.h" |
38 | | #include "yb/rpc/scheduler.h" |
39 | | |
40 | | #include "yb/tserver/pg_client_session.h" |
41 | | #include "yb/tserver/pg_table_cache.h" |
42 | | |
43 | | #include "yb/util/net/net_util.h" |
44 | | #include "yb/util/result.h" |
45 | | #include "yb/util/shared_lock.h" |
46 | | #include "yb/util/status_format.h" |
47 | | #include "yb/util/status_log.h" |
48 | | #include "yb/util/status.h" |
49 | | |
50 | | using namespace std::literals; |
51 | | |
52 | | DEFINE_uint64(pg_client_session_expiration_ms, 60000, |
53 | | "Pg client session expiration time in milliseconds."); |
54 | | |
55 | | namespace yb { |
56 | | namespace tserver { |
57 | | |
58 | | namespace { |
59 | | //-------------------------------------------------------------------------------------------------- |
60 | | // Constants used for the sequences data table. |
61 | | //-------------------------------------------------------------------------------------------------- |
62 | | static constexpr const char* const kPgSequencesNamespaceName = "system_postgres"; |
63 | | static constexpr const char* const kPgSequencesDataTableName = "sequences_data"; |
64 | | |
65 | | // Columns names and ids. |
66 | | static constexpr const char* const kPgSequenceDbOidColName = "db_oid"; |
67 | | |
68 | | static constexpr const char* const kPgSequenceSeqOidColName = "seq_oid"; |
69 | | |
70 | | static constexpr const char* const kPgSequenceLastValueColName = "last_value"; |
71 | | |
72 | | static constexpr const char* const kPgSequenceIsCalledColName = "is_called"; |
73 | | |
74 | | template <class Resp> |
75 | 227k | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { |
76 | 227k | if (!status.ok()) { |
77 | 6.82k | StatusToPB(status, resp->mutable_status()); |
78 | 6.82k | } |
79 | 227k | context->RespondSuccess(); |
80 | 227k | } pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_19PgPerformResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE Line | Count | Source | 75 | 6 | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { | 76 | 6 | if (!status.ok()) { | 77 | 6 | StatusToPB(status, resp->mutable_status()); | 78 | 6 | } | 79 | 6 | context->RespondSuccess(); | 80 | 6 | } |
Unexecuted instantiation: pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_25PgAlterDatabaseResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_22PgAlterTableResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE Line | Count | Source | 75 | 155 | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { | 76 | 155 | if (!status.ok()) { | 77 | 1 | StatusToPB(status, resp->mutable_status()); | 78 | 1 | } | 79 | 155 | context->RespondSuccess(); | 80 | 155 | } |
pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_25PgBackfillIndexResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE Line | Count | Source | 75 | 89 | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { | 76 | 89 | if (!status.ok()) { | 77 | 1 | StatusToPB(status, resp->mutable_status()); | 78 | 1 | } | 79 | 89 | context->RespondSuccess(); | 80 | 89 | } |
pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_26PgCreateDatabaseResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE Line | Count | Source | 75 | 22 | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { | 76 | 22 | if (!status.ok()) { | 77 | 1 | StatusToPB(status, resp->mutable_status()); | 78 | 1 | } | 79 | 22 | context->RespondSuccess(); | 80 | 22 | } |
pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_36PgCreateSequencesDataTableResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE Line | Count | Source | 75 | 21 | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { | 76 | 21 | if (!status.ok()) { | 77 | 0 | StatusToPB(status, resp->mutable_status()); | 78 | 0 | } | 79 | 21 | context->RespondSuccess(); | 80 | 21 | } |
pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_23PgCreateTableResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE Line | Count | Source | 75 | 1.41k | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { | 76 | 1.41k | if (!status.ok()) { | 77 | 4 | StatusToPB(status, resp->mutable_status()); | 78 | 4 | } | 79 | 1.41k | context->RespondSuccess(); | 80 | 1.41k | } |
pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_28PgCreateTablegroupResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE Line | Count | Source | 75 | 1 | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { | 76 | 1 | if (!status.ok()) { | 77 | 0 | StatusToPB(status, resp->mutable_status()); | 78 | 0 | } | 79 | 1 | context->RespondSuccess(); | 80 | 1 | } |
pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_24PgDropDatabaseResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE Line | Count | Source | 75 | 21 | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { | 76 | 21 | if (!status.ok()) { | 77 | 1 | StatusToPB(status, resp->mutable_status()); | 78 | 1 | } | 79 | 21 | context->RespondSuccess(); | 80 | 21 | } |
pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_21PgDropTableResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE Line | Count | Source | 75 | 1.17k | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { | 76 | 1.17k | if (!status.ok()) { | 77 | 2 | StatusToPB(status, resp->mutable_status()); | 78 | 2 | } | 79 | 1.17k | context->RespondSuccess(); | 80 | 1.17k | } |
pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_26PgDropTablegroupResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE Line | Count | Source | 75 | 1 | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { | 76 | 1 | if (!status.ok()) { | 77 | 0 | StatusToPB(status, resp->mutable_status()); | 78 | 0 | } | 79 | 1 | context->RespondSuccess(); | 80 | 1 | } |
pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_29PgFinishTransactionResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE Line | Count | Source | 75 | 82.4k | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { | 76 | 82.4k | if (!status.ok()) { | 77 | 6.77k | StatusToPB(status, resp->mutable_status()); | 78 | 6.77k | } | 79 | 82.4k | context->RespondSuccess(); | 80 | 82.4k | } |
Unexecuted instantiation: pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_35PgGetCatalogMasterVersionResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_27PgGetDatabaseInfoResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE Line | Count | Source | 75 | 1.61k | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { | 76 | 1.61k | if (!status.ok()) { | 77 | 0 | StatusToPB(status, resp->mutable_status()); | 78 | 0 | } | 79 | 1.61k | context->RespondSuccess(); | 80 | 1.61k | } |
pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_21PgHeartbeatResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE Line | Count | Source | 75 | 2.74k | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { | 76 | 2.74k | if (!status.ok()) { | 77 | 0 | StatusToPB(status, resp->mutable_status()); | 78 | 0 | } | 79 | 2.74k | context->RespondSuccess(); | 80 | 2.74k | } |
Unexecuted instantiation: pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_24PgIsInitDbDoneResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_33PgListLiveTabletServersResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE Line | Count | Source | 75 | 2 | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { | 76 | 2 | if (!status.ok()) { | 77 | 0 | StatusToPB(status, resp->mutable_status()); | 78 | 0 | } | 79 | 2 | context->RespondSuccess(); | 80 | 2 | } |
pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_21PgOpenTableResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE Line | Count | Source | 75 | 64.5k | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { | 76 | 64.5k | if (!status.ok()) { | 77 | 37 | StatusToPB(status, resp->mutable_status()); | 78 | 37 | } | 79 | 64.5k | context->RespondSuccess(); | 80 | 64.5k | } |
pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_23PgReserveOidsResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE Line | Count | Source | 75 | 380 | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { | 76 | 380 | if (!status.ok()) { | 77 | 0 | StatusToPB(status, resp->mutable_status()); | 78 | 0 | } | 79 | 380 | context->RespondSuccess(); | 80 | 380 | } |
pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_34PgRollbackSubTransactionResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE Line | Count | Source | 75 | 23.5k | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { | 76 | 23.5k | if (!status.ok()) { | 77 | 0 | StatusToPB(status, resp->mutable_status()); | 78 | 0 | } | 79 | 23.5k | context->RespondSuccess(); | 80 | 23.5k | } |
pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_35PgSetActiveSubTransactionResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE Line | Count | Source | 75 | 48.8k | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { | 76 | 48.8k | if (!status.ok()) { | 77 | 0 | StatusToPB(status, resp->mutable_status()); | 78 | 0 | } | 79 | 48.8k | context->RespondSuccess(); | 80 | 48.8k | } |
pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_29PgTabletServerCountResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE Line | Count | Source | 75 | 57 | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { | 76 | 57 | if (!status.ok()) { | 77 | 0 | StatusToPB(status, resp->mutable_status()); | 78 | 0 | } | 79 | 57 | context->RespondSuccess(); | 80 | 57 | } |
pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_25PgTruncateTableResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE Line | Count | Source | 75 | 31 | void Respond(const Status& status, Resp* resp, rpc::RpcContext* context) { | 76 | 31 | if (!status.ok()) { | 77 | 0 | StatusToPB(status, resp->mutable_status()); | 78 | 0 | } | 79 | 31 | context->RespondSuccess(); | 80 | 31 | } |
Unexecuted instantiation: pg_client_service.cc:_ZN2yb7tserver12_GLOBAL__N_17RespondINS0_29PgValidatePlacementResponsePBEEEvRKNS_6StatusEPT_PNS_3rpc10RpcContextE |
81 | | |
82 | | } // namespace |
83 | | |
84 | | template <class T> |
85 | | class Expirable { |
86 | | public: |
87 | | template <class... Args> |
88 | | explicit Expirable(CoarseDuration lifetime, Args&&... args) |
89 | | : lifetime_(lifetime), expiration_(NewExpiration()), |
90 | 1.65k | value_(std::forward<Args>(args)...) { |
91 | 1.65k | } |
92 | | |
93 | 1.72k | CoarseTimePoint expiration() const { |
94 | 1.72k | return expiration_.load(std::memory_order_acquire); |
95 | 1.72k | } |
96 | | |
97 | 933k | void Touch() { |
98 | 933k | auto new_expiration = NewExpiration(); |
99 | 933k | auto old_expiration = expiration_.load(std::memory_order_acquire); |
100 | 934k | while (new_expiration > old_expiration) { |
101 | 933k | if (expiration_.compare_exchange_weak( |
102 | 933k | old_expiration, new_expiration, std::memory_order_acq_rel)) { |
103 | 933k | break; |
104 | 933k | } |
105 | 933k | } |
106 | 933k | } |
107 | | |
108 | 1.86M | const T& value() const { |
109 | 1.86M | return value_; |
110 | 1.86M | } |
111 | | |
112 | | private: |
113 | 935k | CoarseTimePoint NewExpiration() const { |
114 | 935k | return CoarseMonoClock::now() + lifetime_; |
115 | 935k | } |
116 | | |
117 | | const CoarseDuration lifetime_; |
118 | | std::atomic<CoarseTimePoint> expiration_; |
119 | | T value_; |
120 | | }; |
121 | | |
122 | | template <class Extractor> |
123 | | class ApplyToValue { |
124 | | public: |
125 | | using result_type = typename Extractor::result_type; |
126 | | |
127 | | template <class T> |
128 | 935k | auto operator()(const T& t) const { |
129 | 935k | return extractor_(t.value()); |
130 | 935k | } |
131 | | |
132 | | private: |
133 | | Extractor extractor_; |
134 | | }; |
135 | | |
136 | | class PgClientServiceImpl::Impl { |
137 | | public: |
138 | | explicit Impl( |
139 | | const std::shared_future<client::YBClient*>& client_future, |
140 | | const scoped_refptr<ClockBase>& clock, |
141 | | TransactionPoolProvider transaction_pool_provider, |
142 | | rpc::Scheduler* scheduler) |
143 | | : client_future_(client_future), |
144 | | clock_(clock), |
145 | | transaction_pool_provider_(std::move(transaction_pool_provider)), |
146 | | table_cache_(client_future), |
147 | 9.25k | check_expired_sessions_(scheduler) { |
148 | 9.25k | ScheduleCheckExpiredSessions(CoarseMonoClock::now()); |
149 | 9.25k | } |
150 | | |
151 | 160 | ~Impl() { |
152 | 160 | check_expired_sessions_.Shutdown(); |
153 | 160 | } |
154 | | |
155 | | CHECKED_STATUS Heartbeat( |
156 | 2.74k | const PgHeartbeatRequestPB& req, PgHeartbeatResponsePB* resp, rpc::RpcContext* context) { |
157 | 2.74k | if (req.session_id()) { |
158 | 1.09k | return ResultToStatus(DoGetSession(req.session_id())); |
159 | 1.09k | } |
160 | | |
161 | 1.65k | auto session_id = ++session_serial_no_; |
162 | 1.65k | auto session = std::make_shared<PgClientSession>( |
163 | 1.65k | &client(), clock_, transaction_pool_provider_, &table_cache_, session_id); |
164 | 1.65k | resp->set_session_id(session_id); |
165 | | |
166 | 1.65k | std::lock_guard<rw_spinlock> lock(mutex_); |
167 | 1.65k | auto it = sessions_.emplace( |
168 | 1.65k | FLAGS_pg_client_session_expiration_ms * 1ms, std::move(session)).first; |
169 | 1.65k | session_expiration_queue_.push({it->expiration(), session_id}); |
170 | 1.65k | return Status::OK(); |
171 | 1.65k | } |
172 | | |
173 | | CHECKED_STATUS OpenTable( |
174 | 64.6k | const PgOpenTableRequestPB& req, PgOpenTableResponsePB* resp, rpc::RpcContext* context) { |
175 | 64.6k | if (req.invalidate_cache_time_us()) { |
176 | 551 | table_cache_.InvalidateAll(CoarseTimePoint() + req.invalidate_cache_time_us() * 1us); |
177 | 551 | } |
178 | 64.6k | if (req.reopen()) { |
179 | 2 | table_cache_.Invalidate(req.table_id()); |
180 | 2 | } |
181 | 64.6k | RETURN_NOT_OK(table_cache_.GetInfo( |
182 | 64.6k | req.table_id(), resp->mutable_info(), resp->mutable_partitions())); |
183 | 64.5k | return Status::OK(); |
184 | 64.6k | } |
185 | | |
186 | | CHECKED_STATUS GetDatabaseInfo( |
187 | | const PgGetDatabaseInfoRequestPB& req, PgGetDatabaseInfoResponsePB* resp, |
188 | 1.61k | rpc::RpcContext* context) { |
189 | 1.61k | RETURN_NOT_OK(client().GetNamespaceInfo( |
190 | 1.61k | GetPgsqlNamespaceId(req.oid()), "" /* namespace_name */, YQL_DATABASE_PGSQL, |
191 | 1.61k | resp->mutable_info())); |
192 | | |
193 | 1.61k | return Status::OK(); |
194 | 1.61k | } |
195 | | |
196 | | CHECKED_STATUS IsInitDbDone( |
197 | | const PgIsInitDbDoneRequestPB& req, PgIsInitDbDoneResponsePB* resp, |
198 | 0 | rpc::RpcContext* context) { |
199 | 0 | HostPort master_leader_host_port = client().GetMasterLeaderAddress(); |
200 | 0 | auto proxy = std::make_shared<master::MasterAdminProxy>( |
201 | 0 | &client().proxy_cache(), master_leader_host_port); |
202 | 0 | rpc::RpcController rpc; |
203 | 0 | master::IsInitDbDoneRequestPB master_req; |
204 | 0 | master::IsInitDbDoneResponsePB master_resp; |
205 | 0 | RETURN_NOT_OK(proxy->IsInitDbDone(master_req, &master_resp, &rpc)); |
206 | 0 | if (master_resp.has_error()) { |
207 | 0 | return STATUS_FORMAT( |
208 | 0 | RuntimeError, |
209 | 0 | "IsInitDbDone RPC response hit error: $0", |
210 | 0 | master_resp.error().ShortDebugString()); |
211 | 0 | } |
212 | 0 | if (master_resp.done() && master_resp.has_initdb_error() && |
213 | 0 | !master_resp.initdb_error().empty()) { |
214 | 0 | return STATUS_FORMAT(RuntimeError, "initdb failed: $0", master_resp.initdb_error()); |
215 | 0 | } |
216 | 0 | VLOG(1) << "IsInitDbDone response: " << master_resp.ShortDebugString(); |
217 | | // We return true if initdb finished running, as well as if we know that it created the first |
218 | | // table (pg_proc) to make initdb idempotent on upgrades. |
219 | 0 | resp->set_done(master_resp.done() || master_resp.pg_proc_exists()); |
220 | 0 | return Status::OK(); |
221 | 0 | } |
222 | | |
223 | | CHECKED_STATUS ReserveOids( |
224 | 380 | const PgReserveOidsRequestPB& req, PgReserveOidsResponsePB* resp, rpc::RpcContext* context) { |
225 | 380 | uint32_t begin_oid, end_oid; |
226 | 380 | RETURN_NOT_OK(client().ReservePgsqlOids( |
227 | 380 | GetPgsqlNamespaceId(req.database_oid()), req.next_oid(), req.count(), &begin_oid, |
228 | 380 | &end_oid)); |
229 | 380 | resp->set_begin_oid(begin_oid); |
230 | 380 | resp->set_end_oid(end_oid); |
231 | | |
232 | 380 | return Status::OK(); |
233 | 380 | } |
234 | | |
235 | | CHECKED_STATUS GetCatalogMasterVersion( |
236 | | const PgGetCatalogMasterVersionRequestPB& req, |
237 | | PgGetCatalogMasterVersionResponsePB* resp, |
238 | 0 | rpc::RpcContext* context) { |
239 | 0 | uint64_t version; |
240 | 0 | RETURN_NOT_OK(client().GetYsqlCatalogMasterVersion(&version)); |
241 | 0 | resp->set_version(version); |
242 | 0 | return Status::OK(); |
243 | 0 | } |
244 | | |
245 | | CHECKED_STATUS CreateSequencesDataTable( |
246 | | const PgCreateSequencesDataTableRequestPB& req, |
247 | | PgCreateSequencesDataTableResponsePB* resp, |
248 | 21 | rpc::RpcContext* context) { |
249 | 21 | const client::YBTableName table_name(YQL_DATABASE_PGSQL, |
250 | 21 | kPgSequencesDataNamespaceId, |
251 | 21 | kPgSequencesNamespaceName, |
252 | 21 | kPgSequencesDataTableName); |
253 | 21 | RETURN_NOT_OK(client().CreateNamespaceIfNotExists(kPgSequencesNamespaceName, |
254 | 21 | YQLDatabase::YQL_DATABASE_PGSQL, |
255 | 21 | "" /* creator_role_name */, |
256 | 21 | kPgSequencesDataNamespaceId)); |
257 | | |
258 | | // Set up the schema. |
259 | 21 | client::YBSchemaBuilder schemaBuilder; |
260 | 21 | schemaBuilder.AddColumn(kPgSequenceDbOidColName)->HashPrimaryKey()->Type(yb::INT64)->NotNull(); |
261 | 21 | schemaBuilder.AddColumn(kPgSequenceSeqOidColName)->HashPrimaryKey()->Type(yb::INT64)->NotNull(); |
262 | 21 | schemaBuilder.AddColumn(kPgSequenceLastValueColName)->Type(yb::INT64)->NotNull(); |
263 | 21 | schemaBuilder.AddColumn(kPgSequenceIsCalledColName)->Type(yb::BOOL)->NotNull(); |
264 | 21 | client::YBSchema schema; |
265 | 21 | CHECK_OK(schemaBuilder.Build(&schema)); |
266 | | |
267 | | // Generate the table id. |
268 | 21 | PgObjectId oid(kPgSequencesDataDatabaseOid, kPgSequencesDataTableOid); |
269 | | |
270 | | // Try to create the table. |
271 | 21 | auto table_creator(client().NewTableCreator()); |
272 | | |
273 | 21 | auto status = table_creator->table_name(table_name) |
274 | 21 | .schema(&schema) |
275 | 21 | .table_type(yb::client::YBTableType::PGSQL_TABLE_TYPE) |
276 | 21 | .table_id(oid.GetYBTableId()) |
277 | 21 | .hash_schema(YBHashSchema::kPgsqlHash) |
278 | 21 | .timeout(context->GetClientDeadline() - CoarseMonoClock::now()) |
279 | 21 | .Create(); |
280 | | // If we could create it, then all good! |
281 | 21 | if (status.ok()) { |
282 | 21 | LOG(INFO) << "Table '" << table_name.ToString() << "' created."; |
283 | | // If the table was already there, also not an error... |
284 | 0 | } else if (status.IsAlreadyPresent()) { |
285 | 0 | LOG(INFO) << "Table '" << table_name.ToString() << "' already exists"; |
286 | 0 | } else { |
287 | | // If any other error, report that! |
288 | 0 | LOG(ERROR) << "Error creating table '" << table_name.ToString() << "': " << status; |
289 | 0 | return status; |
290 | 0 | } |
291 | 21 | return Status::OK(); |
292 | 21 | } |
293 | | |
294 | | CHECKED_STATUS TabletServerCount( |
295 | | const PgTabletServerCountRequestPB& req, PgTabletServerCountResponsePB* resp, |
296 | 57 | rpc::RpcContext* context) { |
297 | 57 | int result = 0; |
298 | 57 | RETURN_NOT_OK(client().TabletServerCount(&result, req.primary_only(), /* use_cache= */ true)); |
299 | 57 | resp->set_count(result); |
300 | 57 | return Status::OK(); |
301 | 57 | } |
302 | | |
303 | | CHECKED_STATUS ListLiveTabletServers( |
304 | | const PgListLiveTabletServersRequestPB& req, PgListLiveTabletServersResponsePB* resp, |
305 | 2 | rpc::RpcContext* context) { |
306 | 2 | auto tablet_servers = VERIFY_RESULT(client().ListLiveTabletServers(req.primary_only())); |
307 | 6 | for (const auto& server : tablet_servers) { |
308 | 6 | server.ToPB(resp->mutable_servers()->Add()); |
309 | 6 | } |
310 | 2 | return Status::OK(); |
311 | 2 | } |
312 | | |
313 | | CHECKED_STATUS ValidatePlacement( |
314 | | const PgValidatePlacementRequestPB& req, PgValidatePlacementResponsePB* resp, |
315 | 0 | rpc::RpcContext* context) { |
316 | 0 | master::ReplicationInfoPB replication_info; |
317 | 0 | master::PlacementInfoPB* live_replicas = replication_info.mutable_live_replicas(); |
318 | |
|
319 | 0 | for (const auto& block : req.placement_infos()) { |
320 | 0 | auto pb = live_replicas->add_placement_blocks(); |
321 | 0 | pb->mutable_cloud_info()->set_placement_cloud(block.cloud()); |
322 | 0 | pb->mutable_cloud_info()->set_placement_region(block.region()); |
323 | 0 | pb->mutable_cloud_info()->set_placement_zone(block.zone()); |
324 | 0 | pb->set_min_num_replicas(block.min_num_replicas()); |
325 | 0 | } |
326 | 0 | live_replicas->set_num_replicas(req.num_replicas()); |
327 | |
|
328 | 0 | return client().ValidateReplicationInfo(replication_info); |
329 | 0 | } |
330 | | |
331 | | void Perform( |
332 | 775k | const PgPerformRequestPB& req, PgPerformResponsePB* resp, rpc::RpcContext* context) { |
333 | 775k | auto status = DoPerform(req, resp, context); |
334 | 775k | if (!status.ok()) { |
335 | 6 | Respond(status, resp, context); |
336 | 6 | } |
337 | 775k | } |
338 | | |
339 | | #define PG_CLIENT_SESSION_METHOD_FORWARD(r, data, method) \ |
340 | | CHECKED_STATUS method( \ |
341 | | const BOOST_PP_CAT(BOOST_PP_CAT(Pg, method), RequestPB)& req, \ |
342 | | BOOST_PP_CAT(BOOST_PP_CAT(Pg, method), ResponsePB)* resp, \ |
343 | 157k | rpc::RpcContext* context) { \ |
344 | 157k | return VERIFY_RESULT(GetSession(req))->method(req, resp, context); \ |
345 | 157k | } Unexecuted instantiation: _ZN2yb7tserver19PgClientServiceImpl4Impl13AlterDatabaseERKNS0_24PgAlterDatabaseRequestPBEPNS0_25PgAlterDatabaseResponsePBEPNS_3rpc10RpcContextE _ZN2yb7tserver19PgClientServiceImpl4Impl10AlterTableERKNS0_21PgAlterTableRequestPBEPNS0_22PgAlterTableResponsePBEPNS_3rpc10RpcContextE Line | Count | Source | 343 | 155 | rpc::RpcContext* context) { \ | 344 | 155 | return VERIFY_RESULT(GetSession(req))->method(req, resp, context); \ | 345 | 155 | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl13BackfillIndexERKNS0_24PgBackfillIndexRequestPBEPNS0_25PgBackfillIndexResponsePBEPNS_3rpc10RpcContextE Line | Count | Source | 343 | 89 | rpc::RpcContext* context) { \ | 344 | 89 | return VERIFY_RESULT(GetSession(req))->method(req, resp, context); \ | 345 | 89 | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl14CreateDatabaseERKNS0_25PgCreateDatabaseRequestPBEPNS0_26PgCreateDatabaseResponsePBEPNS_3rpc10RpcContextE Line | Count | Source | 343 | 22 | rpc::RpcContext* context) { \ | 344 | 22 | return VERIFY_RESULT(GetSession(req))->method(req, resp, context); \ | 345 | 22 | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl11CreateTableERKNS0_22PgCreateTableRequestPBEPNS0_23PgCreateTableResponsePBEPNS_3rpc10RpcContextE Line | Count | Source | 343 | 1.41k | rpc::RpcContext* context) { \ | 344 | 1.41k | return VERIFY_RESULT(GetSession(req))->method(req, resp, context); \ | 345 | 1.41k | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl16CreateTablegroupERKNS0_27PgCreateTablegroupRequestPBEPNS0_28PgCreateTablegroupResponsePBEPNS_3rpc10RpcContextE Line | Count | Source | 343 | 1 | rpc::RpcContext* context) { \ | 344 | 1 | return VERIFY_RESULT(GetSession(req))->method(req, resp, context); \ | 345 | 1 | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl12DropDatabaseERKNS0_23PgDropDatabaseRequestPBEPNS0_24PgDropDatabaseResponsePBEPNS_3rpc10RpcContextE Line | Count | Source | 343 | 21 | rpc::RpcContext* context) { \ | 344 | 21 | return VERIFY_RESULT(GetSession(req))->method(req, resp, context); \ | 345 | 21 | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl9DropTableERKNS0_20PgDropTableRequestPBEPNS0_21PgDropTableResponsePBEPNS_3rpc10RpcContextE Line | Count | Source | 343 | 1.17k | rpc::RpcContext* context) { \ | 344 | 1.17k | return VERIFY_RESULT(GetSession(req))->method(req, resp, context); \ | 345 | 1.17k | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl14DropTablegroupERKNS0_25PgDropTablegroupRequestPBEPNS0_26PgDropTablegroupResponsePBEPNS_3rpc10RpcContextE Line | Count | Source | 343 | 1 | rpc::RpcContext* context) { \ | 344 | 1 | return VERIFY_RESULT(GetSession(req))->method(req, resp, context); \ | 345 | 1 | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl17FinishTransactionERKNS0_28PgFinishTransactionRequestPBEPNS0_29PgFinishTransactionResponsePBEPNS_3rpc10RpcContextE Line | Count | Source | 343 | 82.4k | rpc::RpcContext* context) { \ | 344 | 82.4k | return VERIFY_RESULT(GetSession(req))->method(req, resp, context); \ | 345 | 82.4k | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl22RollbackSubTransactionERKNS0_33PgRollbackSubTransactionRequestPBEPNS0_34PgRollbackSubTransactionResponsePBEPNS_3rpc10RpcContextE Line | Count | Source | 343 | 23.5k | rpc::RpcContext* context) { \ | 344 | 23.5k | return VERIFY_RESULT(GetSession(req))->method(req, resp, context); \ | 345 | 23.5k | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl23SetActiveSubTransactionERKNS0_34PgSetActiveSubTransactionRequestPBEPNS0_35PgSetActiveSubTransactionResponsePBEPNS_3rpc10RpcContextE Line | Count | Source | 343 | 48.8k | rpc::RpcContext* context) { \ | 344 | 48.8k | return VERIFY_RESULT(GetSession(req))->method(req, resp, context); \ | 345 | 48.8k | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl13TruncateTableERKNS0_24PgTruncateTableRequestPBEPNS0_25PgTruncateTableResponsePBEPNS_3rpc10RpcContextE Line | Count | Source | 343 | 31 | rpc::RpcContext* context) { \ | 344 | 31 | return VERIFY_RESULT(GetSession(req))->method(req, resp, context); \ | 345 | 31 | } |
|
346 | | |
347 | | BOOST_PP_SEQ_FOR_EACH(PG_CLIENT_SESSION_METHOD_FORWARD, ~, PG_CLIENT_SESSION_METHODS); |
348 | | |
349 | | private: |
350 | 3.75k | client::YBClient& client() { return *client_future_.get(); } |
351 | | |
352 | | template <class Req> |
353 | 932k | Result<PgClientSessionLocker> GetSession(const Req& req) { |
354 | 932k | return GetSession(req.session_id()); |
355 | 932k | } _ZN2yb7tserver19PgClientServiceImpl4Impl10GetSessionINS0_18PgPerformRequestPBEEENS_6ResultINS0_21PgClientSessionLockerEEERKT_ Line | Count | Source | 353 | 775k | Result<PgClientSessionLocker> GetSession(const Req& req) { | 354 | 775k | return GetSession(req.session_id()); | 355 | 775k | } |
Unexecuted instantiation: _ZN2yb7tserver19PgClientServiceImpl4Impl10GetSessionINS0_24PgAlterDatabaseRequestPBEEENS_6ResultINS0_21PgClientSessionLockerEEERKT_ _ZN2yb7tserver19PgClientServiceImpl4Impl10GetSessionINS0_21PgAlterTableRequestPBEEENS_6ResultINS0_21PgClientSessionLockerEEERKT_ Line | Count | Source | 353 | 155 | Result<PgClientSessionLocker> GetSession(const Req& req) { | 354 | 155 | return GetSession(req.session_id()); | 355 | 155 | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl10GetSessionINS0_24PgBackfillIndexRequestPBEEENS_6ResultINS0_21PgClientSessionLockerEEERKT_ Line | Count | Source | 353 | 89 | Result<PgClientSessionLocker> GetSession(const Req& req) { | 354 | 89 | return GetSession(req.session_id()); | 355 | 89 | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl10GetSessionINS0_25PgCreateDatabaseRequestPBEEENS_6ResultINS0_21PgClientSessionLockerEEERKT_ Line | Count | Source | 353 | 22 | Result<PgClientSessionLocker> GetSession(const Req& req) { | 354 | 22 | return GetSession(req.session_id()); | 355 | 22 | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl10GetSessionINS0_22PgCreateTableRequestPBEEENS_6ResultINS0_21PgClientSessionLockerEEERKT_ Line | Count | Source | 353 | 1.41k | Result<PgClientSessionLocker> GetSession(const Req& req) { | 354 | 1.41k | return GetSession(req.session_id()); | 355 | 1.41k | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl10GetSessionINS0_27PgCreateTablegroupRequestPBEEENS_6ResultINS0_21PgClientSessionLockerEEERKT_ Line | Count | Source | 353 | 1 | Result<PgClientSessionLocker> GetSession(const Req& req) { | 354 | 1 | return GetSession(req.session_id()); | 355 | 1 | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl10GetSessionINS0_23PgDropDatabaseRequestPBEEENS_6ResultINS0_21PgClientSessionLockerEEERKT_ Line | Count | Source | 353 | 21 | Result<PgClientSessionLocker> GetSession(const Req& req) { | 354 | 21 | return GetSession(req.session_id()); | 355 | 21 | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl10GetSessionINS0_20PgDropTableRequestPBEEENS_6ResultINS0_21PgClientSessionLockerEEERKT_ Line | Count | Source | 353 | 1.17k | Result<PgClientSessionLocker> GetSession(const Req& req) { | 354 | 1.17k | return GetSession(req.session_id()); | 355 | 1.17k | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl10GetSessionINS0_25PgDropTablegroupRequestPBEEENS_6ResultINS0_21PgClientSessionLockerEEERKT_ Line | Count | Source | 353 | 1 | Result<PgClientSessionLocker> GetSession(const Req& req) { | 354 | 1 | return GetSession(req.session_id()); | 355 | 1 | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl10GetSessionINS0_28PgFinishTransactionRequestPBEEENS_6ResultINS0_21PgClientSessionLockerEEERKT_ Line | Count | Source | 353 | 82.4k | Result<PgClientSessionLocker> GetSession(const Req& req) { | 354 | 82.4k | return GetSession(req.session_id()); | 355 | 82.4k | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl10GetSessionINS0_33PgRollbackSubTransactionRequestPBEEENS_6ResultINS0_21PgClientSessionLockerEEERKT_ Line | Count | Source | 353 | 23.5k | Result<PgClientSessionLocker> GetSession(const Req& req) { | 354 | 23.5k | return GetSession(req.session_id()); | 355 | 23.5k | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl10GetSessionINS0_34PgSetActiveSubTransactionRequestPBEEENS_6ResultINS0_21PgClientSessionLockerEEERKT_ Line | Count | Source | 353 | 48.8k | Result<PgClientSessionLocker> GetSession(const Req& req) { | 354 | 48.8k | return GetSession(req.session_id()); | 355 | 48.8k | } |
_ZN2yb7tserver19PgClientServiceImpl4Impl10GetSessionINS0_24PgTruncateTableRequestPBEEENS_6ResultINS0_21PgClientSessionLockerEEERKT_ Line | Count | Source | 353 | 31 | Result<PgClientSessionLocker> GetSession(const Req& req) { | 354 | 31 | return GetSession(req.session_id()); | 355 | 31 | } |
|
356 | | |
357 | 933k | Result<PgClientSession&> DoGetSession(uint64_t session_id) { |
358 | 933k | SharedLock<rw_spinlock> lock(mutex_); |
359 | 933k | DCHECK_NE(session_id, 0); |
360 | 933k | auto it = sessions_.find(session_id); |
361 | 933k | if (it == sessions_.end()) { |
362 | 0 | return STATUS_FORMAT(InvalidArgument, "Unknown session: $0", session_id); |
363 | 0 | } |
364 | 933k | const_cast<SessionsEntry&>(*it).Touch(); |
365 | 933k | return *it->value(); |
366 | 933k | } |
367 | | |
368 | 932k | Result<PgClientSessionLocker> GetSession(uint64_t session_id) { |
369 | 932k | return PgClientSessionLocker(&VERIFY_RESULT_REF(DoGetSession(session_id))); |
370 | 932k | } |
371 | | |
372 | 13.8k | void ScheduleCheckExpiredSessions(CoarseTimePoint now) REQUIRES(mutex_) { |
373 | 13.8k | auto time = session_expiration_queue_.empty() |
374 | 13.7k | ? CoarseTimePoint(now + FLAGS_pg_client_session_expiration_ms * 1ms) |
375 | 94 | : session_expiration_queue_.top().first + 1s; |
376 | 2.73k | check_expired_sessions_.Schedule([this](const Status& status) { |
377 | 2.73k | if (!status.ok()) { |
378 | 160 | return; |
379 | 160 | } |
380 | 2.57k | this->CheckExpiredSessions(); |
381 | 2.57k | }, time - now); |
382 | 13.8k | } |
383 | | |
384 | 867 | void CheckExpiredSessions() { |
385 | 867 | auto now = CoarseMonoClock::now(); |
386 | 867 | std::lock_guard<rw_spinlock> lock(mutex_); |
387 | 936 | while (!session_expiration_queue_.empty()) { |
388 | 163 | auto& top = session_expiration_queue_.top(); |
389 | 163 | if (top.first > now) { |
390 | 94 | break; |
391 | 94 | } |
392 | 69 | auto id = top.second; |
393 | 69 | session_expiration_queue_.pop(); |
394 | 69 | auto it = sessions_.find(id); |
395 | 69 | if (it != sessions_.end()) { |
396 | 69 | auto current_expiration = it->expiration(); |
397 | 69 | if (current_expiration > now) { |
398 | 37 | session_expiration_queue_.push({current_expiration, id}); |
399 | 32 | } else { |
400 | 32 | sessions_.erase(it); |
401 | 32 | } |
402 | 69 | } |
403 | 69 | } |
404 | 867 | ScheduleCheckExpiredSessions(now); |
405 | 867 | } |
406 | | |
407 | | CHECKED_STATUS DoPerform( |
408 | 775k | const PgPerformRequestPB& req, PgPerformResponsePB* resp, rpc::RpcContext* context) { |
409 | 775k | return VERIFY_RESULT(GetSession(req))->Perform(req, resp, context); |
410 | 775k | } |
411 | | |
412 | | std::shared_future<client::YBClient*> client_future_; |
413 | | scoped_refptr<ClockBase> clock_; |
414 | | TransactionPoolProvider transaction_pool_provider_; |
415 | | PgTableCache table_cache_; |
416 | | rw_spinlock mutex_; |
417 | | |
418 | | class ExpirationTag; |
419 | | |
420 | | using SessionsEntry = Expirable<std::shared_ptr<PgClientSession>>; |
421 | | boost::multi_index_container< |
422 | | SessionsEntry, |
423 | | boost::multi_index::indexed_by< |
424 | | boost::multi_index::hashed_unique< |
425 | | ApplyToValue< |
426 | | boost::multi_index::const_mem_fun<PgClientSession, uint64_t, &PgClientSession::id> |
427 | | > |
428 | | > |
429 | | > |
430 | | > sessions_ GUARDED_BY(mutex_); |
431 | | |
432 | | using ExpirationEntry = std::pair<CoarseTimePoint, uint64_t>; |
433 | | |
434 | | struct CompareExpiration { |
435 | 3.46k | bool operator()(const ExpirationEntry& lhs, const ExpirationEntry& rhs) const { |
436 | 3.46k | return rhs.first > lhs.first; |
437 | 3.46k | } |
438 | | }; |
439 | | |
440 | | std::priority_queue<ExpirationEntry, |
441 | | std::vector<ExpirationEntry>, |
442 | | CompareExpiration> session_expiration_queue_; |
443 | | |
444 | | std::atomic<int64_t> session_serial_no_{0}; |
445 | | |
446 | | rpc::ScheduledTaskTracker check_expired_sessions_; |
447 | | }; |
448 | | |
449 | | PgClientServiceImpl::PgClientServiceImpl( |
450 | | const std::shared_future<client::YBClient*>& client_future, |
451 | | const scoped_refptr<ClockBase>& clock, |
452 | | TransactionPoolProvider transaction_pool_provider, |
453 | | const scoped_refptr<MetricEntity>& entity, |
454 | | rpc::Scheduler* scheduler) |
455 | | : PgClientServiceIf(entity), |
456 | 9.25k | impl_(new Impl(client_future, clock, std::move(transaction_pool_provider), scheduler)) {} |
457 | | |
458 | 160 | PgClientServiceImpl::~PgClientServiceImpl() {} |
459 | | |
460 | | void PgClientServiceImpl::Perform( |
461 | 775k | const PgPerformRequestPB* req, PgPerformResponsePB* resp, rpc::RpcContext context) { |
462 | 775k | impl_->Perform(*req, resp, &context); |
463 | 775k | } |
464 | | |
465 | | #define YB_PG_CLIENT_METHOD_DEFINE(r, data, method) \ |
466 | | void PgClientServiceImpl::method( \ |
467 | | const BOOST_PP_CAT(BOOST_PP_CAT(Pg, method), RequestPB)* req, \ |
468 | | BOOST_PP_CAT(BOOST_PP_CAT(Pg, method), ResponsePB)* resp, \ |
469 | 227k | rpc::RpcContext context) { \ |
470 | 227k | Respond(impl_->method(*req, resp, &context), resp, &context); \ |
471 | 227k | } Unexecuted instantiation: _ZN2yb7tserver19PgClientServiceImpl13AlterDatabaseEPKNS0_24PgAlterDatabaseRequestPBEPNS0_25PgAlterDatabaseResponsePBENS_3rpc10RpcContextE _ZN2yb7tserver19PgClientServiceImpl10AlterTableEPKNS0_21PgAlterTableRequestPBEPNS0_22PgAlterTableResponsePBENS_3rpc10RpcContextE Line | Count | Source | 469 | 155 | rpc::RpcContext context) { \ | 470 | 155 | Respond(impl_->method(*req, resp, &context), resp, &context); \ | 471 | 155 | } |
_ZN2yb7tserver19PgClientServiceImpl13BackfillIndexEPKNS0_24PgBackfillIndexRequestPBEPNS0_25PgBackfillIndexResponsePBENS_3rpc10RpcContextE Line | Count | Source | 469 | 89 | rpc::RpcContext context) { \ | 470 | 89 | Respond(impl_->method(*req, resp, &context), resp, &context); \ | 471 | 89 | } |
_ZN2yb7tserver19PgClientServiceImpl14CreateDatabaseEPKNS0_25PgCreateDatabaseRequestPBEPNS0_26PgCreateDatabaseResponsePBENS_3rpc10RpcContextE Line | Count | Source | 469 | 22 | rpc::RpcContext context) { \ | 470 | 22 | Respond(impl_->method(*req, resp, &context), resp, &context); \ | 471 | 22 | } |
_ZN2yb7tserver19PgClientServiceImpl24CreateSequencesDataTableEPKNS0_35PgCreateSequencesDataTableRequestPBEPNS0_36PgCreateSequencesDataTableResponsePBENS_3rpc10RpcContextE Line | Count | Source | 469 | 21 | rpc::RpcContext context) { \ | 470 | 21 | Respond(impl_->method(*req, resp, &context), resp, &context); \ | 471 | 21 | } |
_ZN2yb7tserver19PgClientServiceImpl11CreateTableEPKNS0_22PgCreateTableRequestPBEPNS0_23PgCreateTableResponsePBENS_3rpc10RpcContextE Line | Count | Source | 469 | 1.41k | rpc::RpcContext context) { \ | 470 | 1.41k | Respond(impl_->method(*req, resp, &context), resp, &context); \ | 471 | 1.41k | } |
_ZN2yb7tserver19PgClientServiceImpl16CreateTablegroupEPKNS0_27PgCreateTablegroupRequestPBEPNS0_28PgCreateTablegroupResponsePBENS_3rpc10RpcContextE Line | Count | Source | 469 | 1 | rpc::RpcContext context) { \ | 470 | 1 | Respond(impl_->method(*req, resp, &context), resp, &context); \ | 471 | 1 | } |
_ZN2yb7tserver19PgClientServiceImpl12DropDatabaseEPKNS0_23PgDropDatabaseRequestPBEPNS0_24PgDropDatabaseResponsePBENS_3rpc10RpcContextE Line | Count | Source | 469 | 21 | rpc::RpcContext context) { \ | 470 | 21 | Respond(impl_->method(*req, resp, &context), resp, &context); \ | 471 | 21 | } |
_ZN2yb7tserver19PgClientServiceImpl9DropTableEPKNS0_20PgDropTableRequestPBEPNS0_21PgDropTableResponsePBENS_3rpc10RpcContextE Line | Count | Source | 469 | 1.17k | rpc::RpcContext context) { \ | 470 | 1.17k | Respond(impl_->method(*req, resp, &context), resp, &context); \ | 471 | 1.17k | } |
_ZN2yb7tserver19PgClientServiceImpl14DropTablegroupEPKNS0_25PgDropTablegroupRequestPBEPNS0_26PgDropTablegroupResponsePBENS_3rpc10RpcContextE Line | Count | Source | 469 | 1 | rpc::RpcContext context) { \ | 470 | 1 | Respond(impl_->method(*req, resp, &context), resp, &context); \ | 471 | 1 | } |
_ZN2yb7tserver19PgClientServiceImpl17FinishTransactionEPKNS0_28PgFinishTransactionRequestPBEPNS0_29PgFinishTransactionResponsePBENS_3rpc10RpcContextE Line | Count | Source | 469 | 82.4k | rpc::RpcContext context) { \ | 470 | 82.4k | Respond(impl_->method(*req, resp, &context), resp, &context); \ | 471 | 82.4k | } |
Unexecuted instantiation: _ZN2yb7tserver19PgClientServiceImpl23GetCatalogMasterVersionEPKNS0_34PgGetCatalogMasterVersionRequestPBEPNS0_35PgGetCatalogMasterVersionResponsePBENS_3rpc10RpcContextE _ZN2yb7tserver19PgClientServiceImpl15GetDatabaseInfoEPKNS0_26PgGetDatabaseInfoRequestPBEPNS0_27PgGetDatabaseInfoResponsePBENS_3rpc10RpcContextE Line | Count | Source | 469 | 1.61k | rpc::RpcContext context) { \ | 470 | 1.61k | Respond(impl_->method(*req, resp, &context), resp, &context); \ | 471 | 1.61k | } |
_ZN2yb7tserver19PgClientServiceImpl9HeartbeatEPKNS0_20PgHeartbeatRequestPBEPNS0_21PgHeartbeatResponsePBENS_3rpc10RpcContextE Line | Count | Source | 469 | 2.74k | rpc::RpcContext context) { \ | 470 | 2.74k | Respond(impl_->method(*req, resp, &context), resp, &context); \ | 471 | 2.74k | } |
Unexecuted instantiation: _ZN2yb7tserver19PgClientServiceImpl12IsInitDbDoneEPKNS0_23PgIsInitDbDoneRequestPBEPNS0_24PgIsInitDbDoneResponsePBENS_3rpc10RpcContextE _ZN2yb7tserver19PgClientServiceImpl21ListLiveTabletServersEPKNS0_32PgListLiveTabletServersRequestPBEPNS0_33PgListLiveTabletServersResponsePBENS_3rpc10RpcContextE Line | Count | Source | 469 | 2 | rpc::RpcContext context) { \ | 470 | 2 | Respond(impl_->method(*req, resp, &context), resp, &context); \ | 471 | 2 | } |
_ZN2yb7tserver19PgClientServiceImpl9OpenTableEPKNS0_20PgOpenTableRequestPBEPNS0_21PgOpenTableResponsePBENS_3rpc10RpcContextE Line | Count | Source | 469 | 64.6k | rpc::RpcContext context) { \ | 470 | 64.6k | Respond(impl_->method(*req, resp, &context), resp, &context); \ | 471 | 64.6k | } |
_ZN2yb7tserver19PgClientServiceImpl11ReserveOidsEPKNS0_22PgReserveOidsRequestPBEPNS0_23PgReserveOidsResponsePBENS_3rpc10RpcContextE Line | Count | Source | 469 | 380 | rpc::RpcContext context) { \ | 470 | 380 | Respond(impl_->method(*req, resp, &context), resp, &context); \ | 471 | 380 | } |
_ZN2yb7tserver19PgClientServiceImpl22RollbackSubTransactionEPKNS0_33PgRollbackSubTransactionRequestPBEPNS0_34PgRollbackSubTransactionResponsePBENS_3rpc10RpcContextE Line | Count | Source | 469 | 23.5k | rpc::RpcContext context) { \ | 470 | 23.5k | Respond(impl_->method(*req, resp, &context), resp, &context); \ | 471 | 23.5k | } |
_ZN2yb7tserver19PgClientServiceImpl23SetActiveSubTransactionEPKNS0_34PgSetActiveSubTransactionRequestPBEPNS0_35PgSetActiveSubTransactionResponsePBENS_3rpc10RpcContextE Line | Count | Source | 469 | 48.8k | rpc::RpcContext context) { \ | 470 | 48.8k | Respond(impl_->method(*req, resp, &context), resp, &context); \ | 471 | 48.8k | } |
_ZN2yb7tserver19PgClientServiceImpl17TabletServerCountEPKNS0_28PgTabletServerCountRequestPBEPNS0_29PgTabletServerCountResponsePBENS_3rpc10RpcContextE Line | Count | Source | 469 | 57 | rpc::RpcContext context) { \ | 470 | 57 | Respond(impl_->method(*req, resp, &context), resp, &context); \ | 471 | 57 | } |
_ZN2yb7tserver19PgClientServiceImpl13TruncateTableEPKNS0_24PgTruncateTableRequestPBEPNS0_25PgTruncateTableResponsePBENS_3rpc10RpcContextE Line | Count | Source | 469 | 31 | rpc::RpcContext context) { \ | 470 | 31 | Respond(impl_->method(*req, resp, &context), resp, &context); \ | 471 | 31 | } |
Unexecuted instantiation: _ZN2yb7tserver19PgClientServiceImpl17ValidatePlacementEPKNS0_28PgValidatePlacementRequestPBEPNS0_29PgValidatePlacementResponsePBENS_3rpc10RpcContextE |
472 | | |
473 | | BOOST_PP_SEQ_FOR_EACH(YB_PG_CLIENT_METHOD_DEFINE, ~, YB_PG_CLIENT_METHODS); |
474 | | |
475 | | } // namespace tserver |
476 | | } // namespace yb |