Skip to content
This repository was archived by the owner on Dec 8, 2021. It is now read-only.

Commit 0e443a3

Browse files
authored
chore: add some async methods to SpannerStub (#1270)
* chore: add some async methods to SpannerStub These are only for use by `SessionPool`; we are not exposing any async APIs to users at this time. Part of #1171 and #1172 * ABI/API update the "break" is adding pure virtual methods to an internal object (`SpannerStub`), so it's not actually a break.
1 parent 5270018 commit 0e443a3

File tree

9 files changed

+204
-0
lines changed

9 files changed

+204
-0
lines changed
3.92 KB
Binary file not shown.

google/cloud/spanner/internal/log_wrapper.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include "google/cloud/spanner/tracing_options.h"
1919
#include "google/cloud/spanner/version.h"
20+
#include "google/cloud/completion_queue.h"
2021
#include "google/cloud/future.h"
2122
#include "google/cloud/internal/invoke_result.h"
2223
#include "google/cloud/log.h"
@@ -95,6 +96,20 @@ Result LogWrapper(Functor&& functor, grpc::ClientContext& context,
9596
return response;
9697
}
9798

99+
template <
100+
typename Functor, typename Request,
101+
typename Result = google::cloud::internal::invoke_result_t<
102+
Functor, grpc::ClientContext&, Request const&, grpc::CompletionQueue*>>
103+
Result LogWrapper(Functor&& functor, grpc::ClientContext& context,
104+
Request const& request, grpc::CompletionQueue* cq,
105+
char const* where, TracingOptions const& options) {
106+
GCP_LOG(DEBUG) << where << "() << " << DebugString(request, options);
107+
auto response = functor(context, request, cq);
108+
GCP_LOG(DEBUG) << where << "() >> " << (response ? "not null" : "null")
109+
<< " async response reader";
110+
return response;
111+
}
112+
98113
template <
99114
typename Functor, typename Request,
100115
typename Result =

google/cloud/spanner/internal/logging_spanner_stub.cc

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,21 @@ LoggingSpannerStub::BatchCreateSessions(
4646
client_context, request, __func__, tracing_options_);
4747
}
4848

49+
std::unique_ptr<grpc::ClientAsyncResponseReaderInterface<
50+
spanner_proto::BatchCreateSessionsResponse>>
51+
LoggingSpannerStub::AsyncBatchCreateSessions(
52+
grpc::ClientContext& client_context,
53+
spanner_proto::BatchCreateSessionsRequest const& request,
54+
grpc::CompletionQueue* cq) {
55+
return LogWrapper(
56+
[this](grpc::ClientContext& context,
57+
spanner_proto::BatchCreateSessionsRequest const& request,
58+
grpc::CompletionQueue* cq) {
59+
return child_->AsyncBatchCreateSessions(context, request, cq);
60+
},
61+
client_context, request, cq, __func__, tracing_options_);
62+
}
63+
4964
StatusOr<spanner_proto::Session> LoggingSpannerStub::GetSession(
5065
grpc::ClientContext& client_context,
5166
spanner_proto::GetSessionRequest const& request) {
@@ -57,6 +72,21 @@ StatusOr<spanner_proto::Session> LoggingSpannerStub::GetSession(
5772
client_context, request, __func__, tracing_options_);
5873
}
5974

75+
std::unique_ptr<
76+
grpc::ClientAsyncResponseReaderInterface<spanner_proto::Session>>
77+
LoggingSpannerStub::AsyncGetSession(
78+
grpc::ClientContext& client_context,
79+
spanner_proto::GetSessionRequest const& request,
80+
grpc::CompletionQueue* cq) {
81+
return LogWrapper(
82+
[this](grpc::ClientContext& context,
83+
spanner_proto::GetSessionRequest const& request,
84+
grpc::CompletionQueue* cq) {
85+
return child_->AsyncGetSession(context, request, cq);
86+
},
87+
client_context, request, cq, __func__, tracing_options_);
88+
}
89+
6090
StatusOr<spanner_proto::ListSessionsResponse> LoggingSpannerStub::ListSessions(
6191
grpc::ClientContext& client_context,
6292
spanner_proto::ListSessionsRequest const& request) {
@@ -79,6 +109,21 @@ Status LoggingSpannerStub::DeleteSession(
79109
client_context, request, __func__, tracing_options_);
80110
}
81111

112+
std::unique_ptr<
113+
grpc::ClientAsyncResponseReaderInterface<google::protobuf::Empty>>
114+
LoggingSpannerStub::AsyncDeleteSession(
115+
grpc::ClientContext& client_context,
116+
spanner_proto::DeleteSessionRequest const& request,
117+
grpc::CompletionQueue* cq) {
118+
return LogWrapper(
119+
[this](grpc::ClientContext& context,
120+
spanner_proto::DeleteSessionRequest const& request,
121+
grpc::CompletionQueue* cq) {
122+
return child_->AsyncDeleteSession(context, request, cq);
123+
},
124+
client_context, request, cq, __func__, tracing_options_);
125+
}
126+
82127
StatusOr<spanner_proto::ResultSet> LoggingSpannerStub::ExecuteSql(
83128
grpc::ClientContext& client_context,
84129
spanner_proto::ExecuteSqlRequest const& request) {

google/cloud/spanner/internal/logging_spanner_stub.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,31 @@ class LoggingSpannerStub : public SpannerStub {
4343
BatchCreateSessions(
4444
grpc::ClientContext& client_context,
4545
google::spanner::v1::BatchCreateSessionsRequest const& request) override;
46+
std::unique_ptr<grpc::ClientAsyncResponseReaderInterface<
47+
google::spanner::v1::BatchCreateSessionsResponse>>
48+
AsyncBatchCreateSessions(
49+
grpc::ClientContext& client_context,
50+
google::spanner::v1::BatchCreateSessionsRequest const& request,
51+
grpc::CompletionQueue* cq) override;
4652
StatusOr<google::spanner::v1::Session> GetSession(
4753
grpc::ClientContext& client_context,
4854
google::spanner::v1::GetSessionRequest const& request) override;
55+
std::unique_ptr<
56+
grpc::ClientAsyncResponseReaderInterface<google::spanner::v1::Session>>
57+
AsyncGetSession(grpc::ClientContext& client_context,
58+
google::spanner::v1::GetSessionRequest const& request,
59+
grpc::CompletionQueue* cq) override;
4960
StatusOr<google::spanner::v1::ListSessionsResponse> ListSessions(
5061
grpc::ClientContext& client_context,
5162
google::spanner::v1::ListSessionsRequest const& request) override;
5263
Status DeleteSession(
5364
grpc::ClientContext& client_context,
5465
google::spanner::v1::DeleteSessionRequest const& request) override;
66+
std::unique_ptr<
67+
grpc::ClientAsyncResponseReaderInterface<google::protobuf::Empty>>
68+
AsyncDeleteSession(grpc::ClientContext& client_context,
69+
google::spanner::v1::DeleteSessionRequest const& request,
70+
grpc::CompletionQueue* cq) override;
5571
StatusOr<google::spanner::v1::ResultSet> ExecuteSql(
5672
grpc::ClientContext& client_context,
5773
google::spanner::v1::ExecuteSqlRequest const& request) override;

google/cloud/spanner/internal/metadata_spanner_stub.cc

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,33 @@ MetadataSpannerStub::BatchCreateSessions(
4343
return child_->BatchCreateSessions(client_context, request);
4444
}
4545

46+
std::unique_ptr<grpc::ClientAsyncResponseReaderInterface<
47+
spanner_proto::BatchCreateSessionsResponse>>
48+
MetadataSpannerStub::AsyncBatchCreateSessions(
49+
grpc::ClientContext& client_context,
50+
spanner_proto::BatchCreateSessionsRequest const& request,
51+
grpc::CompletionQueue* cq) {
52+
SetMetadata(client_context, "database=" + request.database());
53+
return child_->AsyncBatchCreateSessions(client_context, request, cq);
54+
}
55+
4656
StatusOr<spanner_proto::Session> MetadataSpannerStub::GetSession(
4757
grpc::ClientContext& client_context,
4858
spanner_proto::GetSessionRequest const& request) {
4959
SetMetadata(client_context, "name=" + request.name());
5060
return child_->GetSession(client_context, request);
5161
}
5262

63+
std::unique_ptr<
64+
grpc::ClientAsyncResponseReaderInterface<spanner_proto::Session>>
65+
MetadataSpannerStub::AsyncGetSession(
66+
grpc::ClientContext& client_context,
67+
spanner_proto::GetSessionRequest const& request,
68+
grpc::CompletionQueue* cq) {
69+
SetMetadata(client_context, "name=" + request.name());
70+
return child_->AsyncGetSession(client_context, request, cq);
71+
}
72+
5373
StatusOr<spanner_proto::ListSessionsResponse> MetadataSpannerStub::ListSessions(
5474
grpc::ClientContext& client_context,
5575
spanner_proto::ListSessionsRequest const& request) {
@@ -64,6 +84,16 @@ Status MetadataSpannerStub::DeleteSession(
6484
return child_->DeleteSession(client_context, request);
6585
}
6686

87+
std::unique_ptr<
88+
grpc::ClientAsyncResponseReaderInterface<google::protobuf::Empty>>
89+
MetadataSpannerStub::AsyncDeleteSession(
90+
grpc::ClientContext& client_context,
91+
spanner_proto::DeleteSessionRequest const& request,
92+
grpc::CompletionQueue* cq) {
93+
SetMetadata(client_context, "name=" + request.name());
94+
return child_->AsyncDeleteSession(client_context, request, cq);
95+
}
96+
6797
StatusOr<spanner_proto::ResultSet> MetadataSpannerStub::ExecuteSql(
6898
grpc::ClientContext& client_context,
6999
spanner_proto::ExecuteSqlRequest const& request) {

google/cloud/spanner/internal/metadata_spanner_stub.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,31 @@ class MetadataSpannerStub : public SpannerStub {
3838
BatchCreateSessions(
3939
grpc::ClientContext& client_context,
4040
google::spanner::v1::BatchCreateSessionsRequest const& request) override;
41+
std::unique_ptr<grpc::ClientAsyncResponseReaderInterface<
42+
google::spanner::v1::BatchCreateSessionsResponse>>
43+
AsyncBatchCreateSessions(
44+
grpc::ClientContext& client_context,
45+
google::spanner::v1::BatchCreateSessionsRequest const& request,
46+
grpc::CompletionQueue* cq) override;
4147
StatusOr<google::spanner::v1::Session> GetSession(
4248
grpc::ClientContext& client_context,
4349
google::spanner::v1::GetSessionRequest const& request) override;
50+
std::unique_ptr<
51+
grpc::ClientAsyncResponseReaderInterface<google::spanner::v1::Session>>
52+
AsyncGetSession(grpc::ClientContext& client_context,
53+
google::spanner::v1::GetSessionRequest const& request,
54+
grpc::CompletionQueue* cq) override;
4455
StatusOr<google::spanner::v1::ListSessionsResponse> ListSessions(
4556
grpc::ClientContext& client_context,
4657
google::spanner::v1::ListSessionsRequest const& request) override;
4758
Status DeleteSession(
4859
grpc::ClientContext& client_context,
4960
google::spanner::v1::DeleteSessionRequest const& request) override;
61+
std::unique_ptr<
62+
grpc::ClientAsyncResponseReaderInterface<google::protobuf::Empty>>
63+
AsyncDeleteSession(grpc::ClientContext& client_context,
64+
google::spanner::v1::DeleteSessionRequest const& request,
65+
grpc::CompletionQueue* cq) override;
5066
StatusOr<google::spanner::v1::ResultSet> ExecuteSql(
5167
grpc::ClientContext& client_context,
5268
google::spanner::v1::ExecuteSqlRequest const& request) override;

google/cloud/spanner/internal/spanner_stub.cc

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,31 @@ class DefaultSpannerStub : public SpannerStub {
4646
StatusOr<spanner_proto::BatchCreateSessionsResponse> BatchCreateSessions(
4747
grpc::ClientContext& client_context,
4848
spanner_proto::BatchCreateSessionsRequest const& request) override;
49+
std::unique_ptr<grpc::ClientAsyncResponseReaderInterface<
50+
spanner_proto::BatchCreateSessionsResponse>>
51+
AsyncBatchCreateSessions(
52+
grpc::ClientContext& client_context,
53+
spanner_proto::BatchCreateSessionsRequest const& request,
54+
grpc::CompletionQueue* cq) override;
4955
StatusOr<spanner_proto::Session> GetSession(
5056
grpc::ClientContext& client_context,
5157
spanner_proto::GetSessionRequest const& request) override;
58+
std::unique_ptr<
59+
grpc::ClientAsyncResponseReaderInterface<spanner_proto::Session>>
60+
AsyncGetSession(grpc::ClientContext& client_context,
61+
spanner_proto::GetSessionRequest const& request,
62+
grpc::CompletionQueue* cq) override;
5263
StatusOr<spanner_proto::ListSessionsResponse> ListSessions(
5364
grpc::ClientContext& client_context,
5465
spanner_proto::ListSessionsRequest const& request) override;
5566
Status DeleteSession(
5667
grpc::ClientContext& client_context,
5768
spanner_proto::DeleteSessionRequest const& request) override;
69+
std::unique_ptr<
70+
grpc::ClientAsyncResponseReaderInterface<google::protobuf::Empty>>
71+
AsyncDeleteSession(grpc::ClientContext& client_context,
72+
spanner_proto::DeleteSessionRequest const& request,
73+
grpc::CompletionQueue* cq) override;
5874
StatusOr<spanner_proto::ResultSet> ExecuteSql(
5975
grpc::ClientContext& client_context,
6076
spanner_proto::ExecuteSqlRequest const& request) override;
@@ -114,6 +130,15 @@ DefaultSpannerStub::BatchCreateSessions(
114130
return response;
115131
}
116132

133+
std::unique_ptr<grpc::ClientAsyncResponseReaderInterface<
134+
spanner_proto::BatchCreateSessionsResponse>>
135+
DefaultSpannerStub::AsyncBatchCreateSessions(
136+
grpc::ClientContext& client_context,
137+
spanner_proto::BatchCreateSessionsRequest const& request,
138+
grpc::CompletionQueue* cq) {
139+
return grpc_stub_->AsyncBatchCreateSessions(&client_context, request, cq);
140+
}
141+
117142
StatusOr<spanner_proto::Session> DefaultSpannerStub::GetSession(
118143
grpc::ClientContext& client_context,
119144
spanner_proto::GetSessionRequest const& request) {
@@ -126,6 +151,15 @@ StatusOr<spanner_proto::Session> DefaultSpannerStub::GetSession(
126151
return response;
127152
}
128153

154+
std::unique_ptr<
155+
grpc::ClientAsyncResponseReaderInterface<spanner_proto::Session>>
156+
DefaultSpannerStub::AsyncGetSession(
157+
grpc::ClientContext& client_context,
158+
spanner_proto::GetSessionRequest const& request,
159+
grpc::CompletionQueue* cq) {
160+
return grpc_stub_->AsyncGetSession(&client_context, request, cq);
161+
}
162+
129163
StatusOr<spanner_proto::ListSessionsResponse> DefaultSpannerStub::ListSessions(
130164
grpc::ClientContext& client_context,
131165
spanner_proto::ListSessionsRequest const& request) {
@@ -147,6 +181,15 @@ Status DefaultSpannerStub::DeleteSession(
147181
return google::cloud::MakeStatusFromRpcError(grpc_status);
148182
}
149183

184+
std::unique_ptr<
185+
grpc::ClientAsyncResponseReaderInterface<google::protobuf::Empty>>
186+
DefaultSpannerStub::AsyncDeleteSession(
187+
grpc::ClientContext& client_context,
188+
spanner_proto::DeleteSessionRequest const& request,
189+
grpc::CompletionQueue* cq) {
190+
return grpc_stub_->AsyncDeleteSession(&client_context, request, cq);
191+
}
192+
150193
StatusOr<spanner_proto::ResultSet> DefaultSpannerStub::ExecuteSql(
151194
grpc::ClientContext& client_context,
152195
spanner_proto::ExecuteSqlRequest const& request) {

google/cloud/spanner/internal/spanner_stub.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include "google/cloud/spanner/connection_options.h"
1919
#include "google/cloud/spanner/version.h"
20+
#include "google/cloud/completion_queue.h"
2021
#include "google/cloud/status.h"
2122
#include "google/cloud/status_or.h"
2223
#include <google/spanner/v1/spanner.grpc.pb.h>
@@ -54,15 +55,31 @@ class SpannerStub {
5455
BatchCreateSessions(
5556
grpc::ClientContext& client_context,
5657
google::spanner::v1::BatchCreateSessionsRequest const& request) = 0;
58+
virtual std::unique_ptr<grpc::ClientAsyncResponseReaderInterface<
59+
google::spanner::v1::BatchCreateSessionsResponse>>
60+
AsyncBatchCreateSessions(
61+
grpc::ClientContext& client_context,
62+
google::spanner::v1::BatchCreateSessionsRequest const& request,
63+
grpc::CompletionQueue* cq) = 0;
5764
virtual StatusOr<google::spanner::v1::Session> GetSession(
5865
grpc::ClientContext& client_context,
5966
google::spanner::v1::GetSessionRequest const& request) = 0;
67+
virtual std::unique_ptr<
68+
grpc::ClientAsyncResponseReaderInterface<google::spanner::v1::Session>>
69+
AsyncGetSession(grpc::ClientContext& client_context,
70+
google::spanner::v1::GetSessionRequest const& request,
71+
grpc::CompletionQueue* cq) = 0;
6072
virtual StatusOr<google::spanner::v1::ListSessionsResponse> ListSessions(
6173
grpc::ClientContext& client_context,
6274
google::spanner::v1::ListSessionsRequest const& request) = 0;
6375
virtual Status DeleteSession(
6476
grpc::ClientContext& client_context,
6577
google::spanner::v1::DeleteSessionRequest const& request) = 0;
78+
virtual std::unique_ptr<
79+
grpc::ClientAsyncResponseReaderInterface<google::protobuf::Empty>>
80+
AsyncDeleteSession(grpc::ClientContext& client_context,
81+
google::spanner::v1::DeleteSessionRequest const& request,
82+
grpc::CompletionQueue* cq) = 0;
6683
virtual StatusOr<google::spanner::v1::ResultSet> ExecuteSql(
6784
grpc::ClientContext& client_context,
6885
google::spanner::v1::ExecuteSqlRequest const& request) = 0;

google/cloud/spanner/testing/mock_spanner_stub.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,24 @@ class MockSpannerStub : public google::cloud::spanner::internal::SpannerStub {
3636
grpc::ClientContext&,
3737
google::spanner::v1::BatchCreateSessionsRequest const&));
3838

39+
MOCK_METHOD3(AsyncBatchCreateSessions,
40+
std::unique_ptr<grpc::ClientAsyncResponseReaderInterface<
41+
google::spanner::v1::BatchCreateSessionsResponse>>(
42+
grpc::ClientContext&,
43+
google::spanner::v1::BatchCreateSessionsRequest const&,
44+
grpc::CompletionQueue*));
45+
3946
MOCK_METHOD2(GetSession, StatusOr<google::spanner::v1::Session>(
4047
grpc::ClientContext&,
4148
google::spanner::v1::GetSessionRequest const&));
4249

50+
MOCK_METHOD3(AsyncGetSession,
51+
std::unique_ptr<grpc::ClientAsyncResponseReaderInterface<
52+
google::spanner::v1::Session>>(
53+
grpc::ClientContext&,
54+
google::spanner::v1::GetSessionRequest const&,
55+
grpc::CompletionQueue*));
56+
4357
MOCK_METHOD2(ListSessions,
4458
StatusOr<google::spanner::v1::ListSessionsResponse>(
4559
grpc::ClientContext&,
@@ -49,6 +63,14 @@ class MockSpannerStub : public google::cloud::spanner::internal::SpannerStub {
4963
Status(grpc::ClientContext&,
5064
google::spanner::v1::DeleteSessionRequest const&));
5165

66+
MOCK_METHOD3(
67+
AsyncDeleteSession,
68+
std::unique_ptr<
69+
grpc::ClientAsyncResponseReaderInterface<google::protobuf::Empty>>(
70+
grpc::ClientContext&,
71+
google::spanner::v1::DeleteSessionRequest const&,
72+
grpc::CompletionQueue*));
73+
5274
MOCK_METHOD2(ExecuteSql, StatusOr<google::spanner::v1::ResultSet>(
5375
grpc::ClientContext&,
5476
google::spanner::v1::ExecuteSqlRequest const&));

0 commit comments

Comments
 (0)