Skip to content
This repository was archived by the owner on Mar 31, 2026. It is now read-only.

Commit bbd00f4

Browse files
committed
test: stabilize async test suite
1 parent 430036b commit bbd00f4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+574
-487
lines changed

google/cloud/spanner_v1/__init__.py

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,31 @@
2020

2121
__version__: str = package_version.__version__
2222

23+
from google.cloud.spanner_v1 import param_types
24+
from google.cloud.spanner_v1._async.client import Client as AsyncClient
25+
from google.cloud.spanner_v1._async.pool import BurstyPool as AsyncBurstyPool
26+
from google.cloud.spanner_v1._async.pool import PingingPool as AsyncPingingPool
27+
from google.cloud.spanner_v1._async.pool import (
28+
AbstractSessionPool as AsyncAbstractSessionPool,
29+
)
30+
from google.cloud.spanner_v1._async.pool import FixedSizePool as AsyncFixedSizePool
31+
from google.cloud.spanner_v1._async.pool import (
32+
TransactionPingingPool as AsyncTransactionPingingPool,
33+
)
34+
from google.cloud.spanner_v1.client import Client
35+
from google.cloud.spanner_v1.keyset import KeyRange, KeySet
36+
from google.cloud.spanner_v1.pool import (
37+
AbstractSessionPool,
38+
BurstyPool,
39+
FixedSizePool,
40+
PingingPool,
41+
TransactionPingingPool,
42+
)
43+
44+
from .data_types import Interval, JsonObject
45+
from .exceptions import wrap_with_request_id
46+
from .services.spanner import SpannerAsyncClient, SpannerClient
47+
from .transaction import BatchTransactionId, DefaultTransactionOptions
2348
from .types import RequestOptions
2449
from .types.commit_response import CommitResponse
2550
from .types.keys import KeyRange as KeyRangePB
@@ -60,32 +85,6 @@
6085
from .types.transaction import Transaction, TransactionOptions, TransactionSelector
6186
from .types.type import StructType, Type, TypeAnnotationCode, TypeCode
6287

63-
from .data_types import Interval, JsonObject
64-
from .exceptions import wrap_with_request_id
65-
from .services.spanner import SpannerAsyncClient, SpannerClient
66-
from .transaction import BatchTransactionId, DefaultTransactionOptions
67-
68-
from google.cloud.spanner_v1 import param_types
69-
from google.cloud.spanner_v1.client import Client
70-
from google.cloud.spanner_v1.keyset import KeyRange, KeySet
71-
from google.cloud.spanner_v1.pool import (
72-
AbstractSessionPool,
73-
BurstyPool,
74-
FixedSizePool,
75-
PingingPool,
76-
TransactionPingingPool,
77-
)
78-
from google.cloud.spanner_v1._async.client import Client as AsyncClient
79-
from google.cloud.spanner_v1._async.pool import BurstyPool as AsyncBurstyPool
80-
from google.cloud.spanner_v1._async.pool import PingingPool as AsyncPingingPool
81-
from google.cloud.spanner_v1._async.pool import (
82-
AbstractSessionPool as AsyncAbstractSessionPool,
83-
)
84-
from google.cloud.spanner_v1._async.pool import FixedSizePool as AsyncFixedSizePool
85-
from google.cloud.spanner_v1._async.pool import (
86-
TransactionPingingPool as AsyncTransactionPingingPool,
87-
)
88-
8988
COMMIT_TIMESTAMP = "spanner.commit_timestamp()"
9089
"""Placeholder be used to store commit timestamp of a transaction in a column.
9190
This value can only be used for timestamp columns that have set the option

google/cloud/spanner_v1/_async/_helpers.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import asyncio
2+
import inspect
23
import time
34

45
from google.api_core.exceptions import Aborted
@@ -7,9 +8,15 @@
78
async def _delay_until_retry(exc, deadline, attempts, default_retry_delay=None):
89
from google.cloud.spanner_v1._helpers import _get_retry_delay
910

10-
delay = _get_retry_delay(exc, attempts, default_retry_delay)
11-
if time.time() + delay > deadline:
11+
cause = exc.errors[0] if hasattr(exc, "errors") and exc.errors else exc
12+
now = time.time()
13+
if now >= deadline:
1214
raise exc
15+
16+
delay = _get_retry_delay(cause, attempts, default_retry_delay)
17+
if now + delay > deadline:
18+
raise exc
19+
1320
await asyncio.sleep(delay)
1421

1522

@@ -39,9 +46,14 @@ async def _retry(
3946
retries = 0
4047
while True:
4148
try:
42-
return await func()
49+
res = func()
50+
if asyncio.iscoroutine(res) or inspect.isawaitable(res):
51+
return await res
52+
return res
4353
except Exception as e:
44-
if allowed_exceptions and type(e) in allowed_exceptions:
54+
if allowed_exceptions is not None:
55+
if type(e) not in allowed_exceptions:
56+
raise e
4557
_check_err = allowed_exceptions.get(type(e))
4658
if callable(_check_err) and not _check_err(e):
4759
raise e
@@ -80,8 +92,8 @@ def _create_experimental_host_transport(
8092
Raises:
8193
ValueError: If TLS/mTLS configuration is invalid.
8294
"""
83-
import grpc.aio
8495
from google.auth.credentials import AnonymousCredentials
96+
import grpc.aio
8597

8698
channel = None
8799
if use_plain_text:

google/cloud/spanner_v1/_async/batch.py

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,20 @@
2121
from google.api_core.exceptions import InternalServerError
2222

2323
from google.cloud.aio._cross_sync import CrossSync
24-
from google.cloud.spanner_v1 import (
25-
BatchWriteRequest,
26-
CommitRequest,
27-
CommitResponse,
28-
Mutation,
29-
RequestOptions,
30-
TransactionOptions,
31-
)
32-
from google.cloud.spanner_v1._async._helpers import (
33-
_retry,
34-
_retry_on_aborted_exception,
35-
)
24+
from google.cloud.spanner_v1.types.commit_response import CommitResponse
25+
from google.cloud.spanner_v1.types.mutation import Mutation
26+
from google.cloud.spanner_v1.types.spanner import BatchWriteRequest
27+
from google.cloud.spanner_v1.types.spanner import CommitRequest
28+
from google.cloud.spanner_v1.types.spanner import RequestOptions
29+
from google.cloud.spanner_v1.types.transaction import TransactionOptions
30+
from google.cloud.spanner_v1._async._helpers import _retry, _retry_on_aborted_exception
3631
from google.cloud.spanner_v1._helpers import (
3732
AtomicCounter,
3833
_check_rst_stream_error,
3934
_make_list_value_pbs,
40-
_merge_Transaction_Options,
4135
_merge_client_context,
4236
_merge_request_options,
37+
_merge_Transaction_Options,
4338
_metadata_with_leader_aware_routing,
4439
_metadata_with_prefix,
4540
_SessionWrapper,

google/cloud/spanner_v1/_async/client.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,9 @@
6767
ListInstanceConfigsRequest,
6868
ListInstancesRequest,
6969
)
70-
from google.cloud.spanner_v1 import (
71-
DefaultTransactionOptions,
72-
ExecuteSqlRequest,
73-
__version__,
74-
)
70+
from google.cloud.spanner_v1.gapic_version import __version__
71+
from google.cloud.spanner_v1.transaction import DefaultTransactionOptions
72+
from google.cloud.spanner_v1.types.spanner import ExecuteSqlRequest
7573
from google.cloud.spanner_v1._async.instance import Instance
7674
from google.cloud.spanner_v1._helpers import (
7775
_merge_query_options,
@@ -399,12 +397,12 @@ def instance_admin_api(self):
399397
transport=transport,
400398
)
401399
elif self._experimental_host:
402-
from google.cloud.spanner_v1._helpers import (
403-
_create_experimental_host_transport as _create_experimental_host_transport_sync,
404-
)
405400
from google.cloud.spanner_v1._async._helpers import (
406401
_create_experimental_host_transport as _create_experimental_host_transport_async,
407402
)
403+
from google.cloud.spanner_v1._helpers import (
404+
_create_experimental_host_transport as _create_experimental_host_transport_sync,
405+
)
408406

409407
if CrossSync.is_async:
410408
transport = _create_experimental_host_transport_async(
@@ -453,12 +451,12 @@ def database_admin_api(self):
453451
transport=transport,
454452
)
455453
elif self._experimental_host:
456-
from google.cloud.spanner_v1._helpers import (
457-
_create_experimental_host_transport as _create_experimental_host_transport_sync,
458-
)
459454
from google.cloud.spanner_v1._async._helpers import (
460455
_create_experimental_host_transport as _create_experimental_host_transport_async,
461456
)
457+
from google.cloud.spanner_v1._helpers import (
458+
_create_experimental_host_transport as _create_experimental_host_transport_sync,
459+
)
462460

463461
if CrossSync.is_async:
464462
transport = _create_experimental_host_transport_async(

google/cloud/spanner_v1/_async/database.py

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,13 @@
4343
from google.cloud.spanner_admin_database_v1 import CreateDatabaseRequest
4444
from google.cloud.spanner_admin_database_v1 import Database as DatabasePB
4545
from google.cloud.spanner_admin_database_v1.types import DatabaseDialect
46-
from google.cloud.spanner_v1 import (
47-
DefaultTransactionOptions,
48-
ExecuteSqlRequest,
49-
RequestOptions,
50-
TransactionOptions,
51-
TransactionSelector,
52-
Type,
53-
TypeCode,
54-
)
46+
from google.cloud.spanner_v1.transaction import DefaultTransactionOptions
47+
from google.cloud.spanner_v1.types.spanner import ExecuteSqlRequest
48+
from google.cloud.spanner_v1.types.spanner import RequestOptions
49+
from google.cloud.spanner_v1.types.transaction import TransactionOptions
50+
from google.cloud.spanner_v1.types.transaction import TransactionSelector
51+
from google.cloud.spanner_v1.types.type import Type
52+
from google.cloud.spanner_v1.types.type import TypeCode
5553
from google.cloud.spanner_v1._async.batch import Batch, MutationGroups
5654
from google.cloud.spanner_v1._async.database_sessions_manager import (
5755
DatabaseSessionsManager,
@@ -481,12 +479,12 @@ def spanner_api(self):
481479
)
482480
return self._spanner_api
483481
if self._instance.experimental_host is not None:
484-
from google.cloud.spanner_v1._helpers import (
485-
_create_experimental_host_transport as _create_experimental_host_transport_sync,
486-
)
487482
from google.cloud.spanner_v1._async._helpers import (
488483
_create_experimental_host_transport as _create_experimental_host_transport_async,
489484
)
485+
from google.cloud.spanner_v1._helpers import (
486+
_create_experimental_host_transport as _create_experimental_host_transport_sync,
487+
)
490488

491489
if CrossSync.is_async:
492490
transport = _create_experimental_host_transport_async(

google/cloud/spanner_v1/_async/pool.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121

2222
from google.cloud.aio._cross_sync import CrossSync
2323
from google.cloud.exceptions import NotFound
24-
from google.cloud.spanner_v1 import BatchCreateSessionsRequest
25-
from google.cloud.spanner_v1 import Session as SessionProto
24+
from google.cloud.spanner_v1.types.spanner import BatchCreateSessionsRequest
25+
from google.cloud.spanner_v1.types.spanner import Session as SessionProto
2626
from google.cloud.spanner_v1._async.session import Session
2727
from google.cloud.spanner_v1._helpers import (
2828
_metadata_with_leader_aware_routing,
@@ -35,7 +35,9 @@
3535
)
3636
from google.cloud.spanner_v1.metrics.metrics_capture import MetricsCapture
3737

38-
_NOW = datetime.datetime.utcnow # unit tests may replace
38+
39+
def _NOW():
40+
return datetime.datetime.now(datetime.timezone.utc)
3941

4042

4143
@CrossSync.convert_class

google/cloud/spanner_v1/_async/session.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
"""Wrapper for Cloud Spanner Session objects."""
1616
__CROSS_SYNC_OUTPUT__ = "google.cloud.spanner_v1.session"
17-
from datetime import datetime
17+
from datetime import datetime, timezone
1818
from functools import total_ordering
1919
import time
2020
from typing import MutableMapping, Optional
@@ -23,12 +23,13 @@
2323
from google.api_core.gapic_v1 import method
2424

2525
from google.cloud.aio._cross_sync import CrossSync
26-
from google.cloud.spanner_v1 import CreateSessionRequest, ExecuteSqlRequest
26+
from google.cloud.spanner_v1.types.spanner import CreateSessionRequest
27+
from google.cloud.spanner_v1.types.spanner import ExecuteSqlRequest
28+
from google.cloud.spanner_v1._async._helpers import _delay_until_retry
2729
from google.cloud.spanner_v1._async.batch import Batch
2830
from google.cloud.spanner_v1._async.snapshot import Snapshot
2931
from google.cloud.spanner_v1._async.transaction import Transaction
3032
from google.cloud.spanner_v1._helpers import (
31-
_delay_until_retry,
3233
_get_retry_delay,
3334
_metadata_with_leader_aware_routing,
3435
_metadata_with_prefix,
@@ -77,7 +78,7 @@ def __init__(self, database, labels=None, database_role=None, is_multiplexed=Fal
7778
self._labels: MutableMapping[str, str] = labels
7879
self._database_role: Optional[str] = database_role
7980
self._is_multiplexed: bool = is_multiplexed
80-
self._last_use_time: datetime = datetime.utcnow()
81+
self._last_use_time: datetime = datetime.now(timezone.utc)
8182

8283
@property
8384
def _resource_info(self):
@@ -393,7 +394,7 @@ async def read(self, table, columns, keyset, index="", limit=0, column_info=None
393394
:rtype: :class:`~google.cloud.spanner_v1.streamed.StreamedResultSet`
394395
:returns: a result set instance which can be used to consume rows.
395396
"""
396-
return self.snapshot().read(
397+
return await self.snapshot().read(
397398
table, columns, keyset, index, limit, column_info=column_info
398399
)
399400

@@ -460,7 +461,7 @@ async def execute_sql(
460461
:rtype: :class:`~google.cloud.spanner_v1.streamed.StreamedResultSet`
461462
:returns: a result set instance which can be used to consume rows.
462463
"""
463-
return self.snapshot().execute_sql(
464+
return await self.snapshot().execute_sql(
464465
sql,
465466
params,
466467
param_types,
@@ -598,7 +599,7 @@ async def run_in_transaction(self, func, *args, **kw):
598599
"Transaction was aborted in user operation, retrying",
599600
attributes,
600601
)
601-
_delay_until_retry(
602+
await _delay_until_retry(
602603
exc,
603604
deadline,
604605
attempts,
@@ -644,7 +645,7 @@ async def run_in_transaction(self, func, *args, **kw):
644645
"Transaction was aborted during commit, retrying",
645646
attributes,
646647
)
647-
_delay_until_retry(
648+
await _delay_until_retry(
648649
exc,
649650
deadline,
650651
attempts,

google/cloud/spanner_v1/_async/snapshot.py

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,19 @@
2727
from google.protobuf.struct_pb2 import Struct
2828

2929
from google.cloud.aio._cross_sync import CrossSync
30-
from google.cloud.spanner_v1 import (
31-
BeginTransactionRequest,
32-
ExecuteSqlRequest,
33-
Mutation,
34-
PartialResultSet,
35-
PartitionOptions,
36-
PartitionQueryRequest,
37-
PartitionReadRequest,
38-
ReadRequest,
39-
RequestOptions,
40-
ResultSet,
41-
Transaction,
42-
TransactionOptions,
43-
TransactionSelector,
44-
)
30+
from google.cloud.spanner_v1.types.mutation import Mutation
31+
from google.cloud.spanner_v1.types.result_set import PartialResultSet
32+
from google.cloud.spanner_v1.types.result_set import ResultSet
33+
from google.cloud.spanner_v1.types.spanner import BeginTransactionRequest
34+
from google.cloud.spanner_v1.types.spanner import ExecuteSqlRequest
35+
from google.cloud.spanner_v1.types.spanner import PartitionOptions
36+
from google.cloud.spanner_v1.types.spanner import PartitionQueryRequest
37+
from google.cloud.spanner_v1.types.spanner import PartitionReadRequest
38+
from google.cloud.spanner_v1.types.spanner import ReadRequest
39+
from google.cloud.spanner_v1.types.spanner import RequestOptions
40+
from google.cloud.spanner_v1.types.transaction import Transaction
41+
from google.cloud.spanner_v1.types.transaction import TransactionOptions
42+
from google.cloud.spanner_v1.types.transaction import TransactionSelector
4543
from google.cloud.spanner_v1._async._helpers import _retry
4644
from google.cloud.spanner_v1._async.streamed import StreamedResultSet
4745
from google.cloud.spanner_v1._helpers import (

google/cloud/spanner_v1/_async/streamed.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818

1919
from google.cloud import exceptions
2020
from google.cloud.aio._cross_sync import CrossSync
21-
from google.cloud.spanner_v1 import PartialResultSet, ResultSetMetadata, TypeCode
21+
from google.cloud.spanner_v1.types.result_set import PartialResultSet
22+
from google.cloud.spanner_v1.types.result_set import ResultSetMetadata
23+
from google.cloud.spanner_v1.types.type import TypeCode
2224
from google.cloud.spanner_v1._helpers import _get_type_decoder, _parse_nullable
2325

2426

0 commit comments

Comments
 (0)