Skip to content

Commit 0478a40

Browse files
committed
More plumbing for Database DDL methods
1 parent 9b79dcb commit 0478a40

File tree

5 files changed

+161
-22
lines changed

5 files changed

+161
-22
lines changed

google/cloud/spanner_v1/database.py

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,10 @@ def create(self):
515515
database_dialect=self._database_dialect,
516516
proto_descriptors=self._proto_descriptors,
517517
)
518-
future = api.create_database(request=request, metadata=metadata)
518+
future = api.create_database(
519+
request=request,
520+
metadata=self.metadata_with_request_id(self._next_nth_request, 1, metadata),
521+
)
519522
return future
520523

521524
def exists(self):
@@ -531,7 +534,12 @@ def exists(self):
531534
metadata = _metadata_with_prefix(self.name)
532535

533536
try:
534-
api.get_database_ddl(database=self.name, metadata=metadata)
537+
api.get_database_ddl(
538+
database=self.name,
539+
metadata=self.metadata_with_request_id(
540+
self._next_nth_request, 1, metadata
541+
),
542+
)
535543
except NotFound:
536544
return False
537545
return True
@@ -548,10 +556,16 @@ def reload(self):
548556
"""
549557
api = self._instance._client.database_admin_api
550558
metadata = _metadata_with_prefix(self.name)
551-
response = api.get_database_ddl(database=self.name, metadata=metadata)
559+
response = api.get_database_ddl(
560+
database=self.name,
561+
metadata=self.metadata_with_request_id(self._next_nth_request, 1, metadata),
562+
)
552563
self._ddl_statements = tuple(response.statements)
553564
self._proto_descriptors = response.proto_descriptors
554-
response = api.get_database(name=self.name, metadata=metadata)
565+
response = api.get_database(
566+
name=self.name,
567+
metadata=self.metadata_with_request_id(self._next_nth_request, 1, metadata),
568+
)
555569
self._state = DatabasePB.State(response.state)
556570
self._create_time = response.create_time
557571
self._restore_info = response.restore_info
@@ -596,7 +610,10 @@ def update_ddl(self, ddl_statements, operation_id="", proto_descriptors=None):
596610
proto_descriptors=proto_descriptors,
597611
)
598612

599-
future = api.update_database_ddl(request=request, metadata=metadata)
613+
future = api.update_database_ddl(
614+
request=request,
615+
metadata=self.metadata_with_request_id(self._next_nth_request, 1, metadata),
616+
)
600617
return future
601618

602619
def update(self, fields):
@@ -634,7 +651,9 @@ def update(self, fields):
634651
metadata = _metadata_with_prefix(self.name)
635652

636653
future = api.update_database(
637-
database=database_pb, update_mask=field_mask, metadata=metadata
654+
database=database_pb,
655+
update_mask=field_mask,
656+
metadata=self.metadata_with_request_id(self._next_nth_request, 1, metadata),
638657
)
639658

640659
return future
@@ -647,7 +666,10 @@ def drop(self):
647666
"""
648667
api = self._instance._client.database_admin_api
649668
metadata = _metadata_with_prefix(self.name)
650-
api.drop_database(database=self.name, metadata=metadata)
669+
api.drop_database(
670+
database=self.name,
671+
metadata=self.metadata_with_request_id(self._next_nth_request, 1, metadata),
672+
)
651673

652674
def execute_partitioned_dml(
653675
self,
@@ -995,7 +1017,7 @@ def restore(self, source):
9951017
)
9961018
future = api.restore_database(
9971019
request=request,
998-
metadata=metadata,
1020+
metadata=self.metadata_with_request_id(self._next_nth_request, 1, metadata),
9991021
)
10001022
return future
10011023

@@ -1064,7 +1086,10 @@ def list_database_roles(self, page_size=None):
10641086
parent=self.name,
10651087
page_size=page_size,
10661088
)
1067-
return api.list_database_roles(request=request, metadata=metadata)
1089+
return api.list_database_roles(
1090+
request=request,
1091+
metadata=self.metadata_with_request_id(self._next_nth_request, 1, metadata),
1092+
)
10681093

10691094
def table(self, table_id):
10701095
"""Factory to create a table object within this database.
@@ -1148,7 +1173,10 @@ def get_iam_policy(self, policy_version=None):
11481173
requested_policy_version=policy_version
11491174
),
11501175
)
1151-
response = api.get_iam_policy(request=request, metadata=metadata)
1176+
response = api.get_iam_policy(
1177+
request=request,
1178+
metadata=self.metadata_with_request_id(self._next_nth_request, 1, metadata),
1179+
)
11521180
return response
11531181

11541182
def set_iam_policy(self, policy):
@@ -1170,7 +1198,10 @@ def set_iam_policy(self, policy):
11701198
resource=self.name,
11711199
policy=policy,
11721200
)
1173-
response = api.set_iam_policy(request=request, metadata=metadata)
1201+
response = api.set_iam_policy(
1202+
request=request,
1203+
metadata=self.metadata_with_request_id(self._next_nth_request, 1, metadata),
1204+
)
11741205
return response
11751206

11761207
@property

google/cloud/spanner_v1/pool.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -576,7 +576,9 @@ def bind(self, database):
576576
while created_session_count < self.size:
577577
resp = api.batch_create_sessions(
578578
request=request,
579-
metadata=metadata,
579+
metadata=database.metadata_with_request_id(
580+
database._next_nth_request, 1, metadata
581+
),
580582
)
581583
for session_pb in resp.session:
582584
session = self._new_session()

google/cloud/spanner_v1/session.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,9 @@ def create(self):
168168
):
169169
session_pb = api.create_session(
170170
request=request,
171-
metadata=metadata,
171+
metadata=self._database.metadata_with_request_id(
172+
self._database._next_nth_request, 1, metadata
173+
),
172174
)
173175
self._session_id = session_pb.name.split("/")[-1]
174176

@@ -257,7 +259,12 @@ def delete(self):
257259
},
258260
observability_options=observability_options,
259261
):
260-
api.delete_session(name=self.name, metadata=metadata)
262+
api.delete_session(
263+
name=self.name,
264+
metadata=database.metadata_with_request_id(
265+
database._next_nth_request, 1, metadata
266+
),
267+
)
261268

262269
def ping(self):
263270
"""Ping the session to keep it alive by executing "SELECT 1".
@@ -266,13 +273,18 @@ def ping(self):
266273
"""
267274
if self._session_id is None:
268275
raise ValueError("Session ID not set by back-end")
269-
api = self._database.spanner_api
270276
database = self._database
271-
metadata = database.metadata_with_request_id(
272-
database._next_nth_request, 1, _metadata_with_prefix(database.name)
273-
)
277+
api = database.spanner_api
278+
database = self._database
274279
request = ExecuteSqlRequest(session=self.name, sql="SELECT 1")
275-
api.execute_sql(request=request, metadata=metadata)
280+
api.execute_sql(
281+
request=request,
282+
metadata=database.metadata_with_request_id(
283+
database._next_nth_request,
284+
1,
285+
_metadata_with_prefix(database.name),
286+
),
287+
)
276288
self._last_use_time = datetime.now()
277289

278290
def snapshot(self, **kw):

tests/unit/test_pool.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919
from datetime import datetime, timedelta
2020

2121
import mock
22+
from google.cloud.spanner_v1._helpers import (
23+
_metadata_with_request_id,
24+
AtomicCounter,
25+
)
26+
2227
from google.cloud.spanner_v1._opentelemetry_tracing import trace_call
2328
from tests._helpers import (
2429
OpenTelemetryBase,
@@ -1179,6 +1184,9 @@ def session_id(self):
11791184

11801185

11811186
class _Database(object):
1187+
NTH_REQUEST = AtomicCounter()
1188+
NTH_CLIENT_ID = AtomicCounter()
1189+
11821190
def __init__(self, name):
11831191
self.name = name
11841192
self._sessions = []
@@ -1233,6 +1241,28 @@ def session(self, **kwargs):
12331241
def observability_options(self):
12341242
return dict(db_name=self.name)
12351243

1244+
@property
1245+
def _next_nth_request(self):
1246+
return self.NTH_REQUEST.increment()
1247+
1248+
@property
1249+
def _nth_client_id(self):
1250+
return self.NTH_CLIENT_ID.increment()
1251+
1252+
def metadata_with_request_id(self, nth_request, nth_attempt, prior_metadata=[]):
1253+
client_id = self._nth_client_id
1254+
return _metadata_with_request_id(
1255+
self._nth_client_id,
1256+
self._channel_id,
1257+
nth_request,
1258+
nth_attempt,
1259+
prior_metadata,
1260+
)
1261+
1262+
@property
1263+
def _channel_id(self):
1264+
return 1
1265+
12361266

12371267
class _Queue(object):
12381268
_size = 1

0 commit comments

Comments
 (0)