Skip to content

Commit 89da17e

Browse files
authored
fix: fix for binding of pinging and bursty pool with database role (#871)
* feat:fgac changes and samples * linting * fixing samples * linting * linting * Update database.py * Update pool.py * Update snippets.py * fixing pools * fixing tests * changes
1 parent f6edf6b commit 89da17e

File tree

3 files changed

+62
-7
lines changed

3 files changed

+62
-7
lines changed

google/cloud/spanner_v1/pool.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,14 +193,14 @@ def bind(self, database):
193193
metadata = _metadata_with_prefix(database.name)
194194
self._database_role = self._database_role or self._database.database_role
195195
request = BatchCreateSessionsRequest(
196+
database=database.database_id,
197+
session_count=self.size - self._sessions.qsize(),
196198
session_template=Session(creator_role=self.database_role),
197199
)
198200

199201
while not self._sessions.full():
200202
resp = api.batch_create_sessions(
201203
request=request,
202-
database=database.name,
203-
session_count=self.size - self._sessions.qsize(),
204204
metadata=metadata,
205205
)
206206
for session_pb in resp.session:
@@ -406,14 +406,14 @@ def bind(self, database):
406406
self._database_role = self._database_role or self._database.database_role
407407

408408
request = BatchCreateSessionsRequest(
409+
database=database.database_id,
410+
session_count=self.size - created_session_count,
409411
session_template=Session(creator_role=self.database_role),
410412
)
411413

412414
while created_session_count < self.size:
413415
resp = api.batch_create_sessions(
414416
request=request,
415-
database=database.name,
416-
session_count=self.size - created_session_count,
417417
metadata=metadata,
418418
)
419419
for session_pb in resp.session:

tests/system/test_database_api.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from google.api_core import exceptions
2121
from google.iam.v1 import policy_pb2
2222
from google.cloud import spanner_v1
23+
from google.cloud.spanner_v1.pool import FixedSizePool, PingingPool
2324
from google.type import expr_pb2
2425
from . import _helpers
2526
from . import _sample_data
@@ -73,6 +74,61 @@ def test_create_database(shared_instance, databases_to_delete, database_dialect)
7374
assert temp_db.name in database_ids
7475

7576

77+
def test_database_binding_of_fixed_size_pool(
78+
not_emulator, shared_instance, databases_to_delete, not_postgres
79+
):
80+
temp_db_id = _helpers.unique_id("fixed_size_db", separator="_")
81+
temp_db = shared_instance.database(temp_db_id)
82+
83+
create_op = temp_db.create()
84+
databases_to_delete.append(temp_db)
85+
create_op.result(DBAPI_OPERATION_TIMEOUT) # raises on failure / timeout.
86+
87+
# Create role and grant select permission on table contacts for parent role.
88+
ddl_statements = _helpers.DDL_STATEMENTS + [
89+
"CREATE ROLE parent",
90+
"GRANT SELECT ON TABLE contacts TO ROLE parent",
91+
]
92+
operation = temp_db.update_ddl(ddl_statements)
93+
operation.result(DBAPI_OPERATION_TIMEOUT) # raises on failure / timeout.
94+
95+
pool = FixedSizePool(
96+
size=1,
97+
default_timeout=500,
98+
database_role="parent",
99+
)
100+
database = shared_instance.database(temp_db.name, pool=pool)
101+
assert database._pool.database_role == "parent"
102+
103+
104+
def test_database_binding_of_pinging_pool(
105+
not_emulator, shared_instance, databases_to_delete, not_postgres
106+
):
107+
temp_db_id = _helpers.unique_id("binding_db", separator="_")
108+
temp_db = shared_instance.database(temp_db_id)
109+
110+
create_op = temp_db.create()
111+
databases_to_delete.append(temp_db)
112+
create_op.result(DBAPI_OPERATION_TIMEOUT) # raises on failure / timeout.
113+
114+
# Create role and grant select permission on table contacts for parent role.
115+
ddl_statements = _helpers.DDL_STATEMENTS + [
116+
"CREATE ROLE parent",
117+
"GRANT SELECT ON TABLE contacts TO ROLE parent",
118+
]
119+
operation = temp_db.update_ddl(ddl_statements)
120+
operation.result(DBAPI_OPERATION_TIMEOUT) # raises on failure / timeout.
121+
122+
pool = PingingPool(
123+
size=1,
124+
default_timeout=500,
125+
ping_interval=100,
126+
database_role="parent",
127+
)
128+
database = shared_instance.database(temp_db.name, pool=pool)
129+
assert database._pool.database_role == "parent"
130+
131+
76132
def test_create_database_pitr_invalid_retention_period(
77133
not_emulator, # PITR-lite features are not supported by the emulator
78134
not_postgres,

tests/unit/test_pool.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -956,11 +956,10 @@ def __init__(self, name):
956956
self.name = name
957957
self._sessions = []
958958
self._database_role = None
959+
self.database_id = name
959960

960961
def mock_batch_create_sessions(
961962
request=None,
962-
database=None,
963-
session_count=10,
964963
timeout=10,
965964
metadata=[],
966965
labels={},
@@ -969,7 +968,7 @@ def mock_batch_create_sessions(
969968
from google.cloud.spanner_v1 import Session
970969

971970
database_role = request.session_template.creator_role if request else None
972-
if session_count < 2:
971+
if request.session_count < 2:
973972
response = BatchCreateSessionsResponse(
974973
session=[Session(creator_role=database_role, labels=labels)]
975974
)

0 commit comments

Comments
 (0)