YugabyteDB (2.13.0.0-b42, bfc6a6643e7399ac8a0e81d06a3ee6d6571b33ab)

Coverage Report

Created: 2022-03-09 17:30

/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