Skip to content

Commit 8899249

Browse files
committed
fix tests
1 parent 08ae94c commit 8899249

20 files changed

+185
-75
lines changed

google/cloud/spanner_v1/_helpers.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,10 @@
2929
from google.rpc.error_details_pb2 import RetryInfo
3030

3131
from google.cloud._helpers import _date_from_iso8601_date
32-
from google.cloud.spanner_v1 import (
33-
ExecuteSqlRequest,
34-
Interval,
35-
JsonObject,
36-
TransactionOptions,
37-
TypeCode,
38-
)
32+
from google.cloud.spanner_v1.types.spanner import ExecuteSqlRequest
33+
from google.cloud.spanner_v1.data_types import Interval, JsonObject
34+
from google.cloud.spanner_v1.types.transaction import TransactionOptions
35+
from google.cloud.spanner_v1.types.type import TypeCode
3936
from google.cloud.spanner_v1.request_id_header import with_request_id
4037

4138
try:

google/cloud/spanner_v1/_opentelemetry_tracing.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
from datetime import datetime
1919
import os
2020

21-
from google.cloud.spanner_v1 import SpannerClient, gapic_version
21+
from google.cloud.spanner_v1.services.spanner import SpannerClient
22+
from google.cloud.spanner_v1 import gapic_version
2223
from google.cloud.spanner_v1._helpers import _metadata_with_span_context
2324

2425
try:

google/cloud/spanner_v1/batch.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@
1818

1919
from google.api_core.exceptions import InternalServerError
2020

21-
from google.cloud.spanner_v1 import (
21+
from google.cloud.spanner_v1.types.spanner import (
2222
BatchWriteRequest,
2323
CommitRequest,
24-
Mutation,
25-
RequestOptions,
26-
TransactionOptions,
2724
)
25+
from google.cloud.spanner_v1.types.mutation import Mutation
26+
from google.cloud.spanner_v1.types import RequestOptions
27+
from google.cloud.spanner_v1.types.transaction import TransactionOptions
2828
from google.cloud.spanner_v1._helpers import (
2929
AtomicCounter,
3030
_check_rst_stream_error,

google/cloud/spanner_v1/client.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,9 @@
4545
from google.cloud.spanner_admin_instance_v1.services.instance_admin.transports.grpc import (
4646
InstanceAdminGrpcTransport,
4747
)
48-
from google.cloud.spanner_v1 import (
49-
DefaultTransactionOptions,
50-
ExecuteSqlRequest,
51-
__version__,
52-
)
48+
from google.cloud.spanner_v1.transaction import DefaultTransactionOptions
49+
from google.cloud.spanner_v1.types import ExecuteSqlRequest
50+
from google.cloud.spanner_v1 import __version__
5351
from google.cloud.spanner_v1._helpers import _merge_query_options, _metadata_with_prefix
5452
from google.cloud.spanner_v1.instance import Instance
5553
from google.cloud.spanner_v1.metrics.constants import (

google/cloud/spanner_v1/database.py

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,12 @@
3939
from google.cloud.spanner_admin_database_v1 import CreateDatabaseRequest
4040
from google.cloud.spanner_admin_database_v1 import Database as DatabasePB
4141
from google.cloud.spanner_admin_database_v1.types import DatabaseDialect
42-
from google.cloud.spanner_v1 import (
43-
DefaultTransactionOptions,
44-
ExecuteSqlRequest,
45-
RequestOptions,
46-
SpannerClient,
47-
TransactionOptions,
48-
TransactionSelector,
49-
Type,
50-
TypeCode,
51-
)
42+
from google.cloud.spanner_v1.transaction import DefaultTransactionOptions
43+
from google.cloud.spanner_v1.types.spanner import ExecuteSqlRequest
44+
from google.cloud.spanner_v1.types import RequestOptions
45+
from google.cloud.spanner_v1.services.spanner import SpannerClient
46+
from google.cloud.spanner_v1.types.transaction import TransactionOptions, TransactionSelector
47+
from google.cloud.spanner_v1.types.type import Type, TypeCode
5248
from google.cloud.spanner_v1._helpers import (
5349
_merge_query_options,
5450
_metadata_with_leader_aware_routing,
@@ -467,6 +463,38 @@ def session_options(self) -> SessionOptions:
467463
"""
468464
return self._instance._client.session_options
469465

466+
@property
467+
def _pool(self):
468+
"""Backward compatibility property for accessing the session pool.
469+
470+
:rtype: :class:`~google.cloud.spanner_v1.pool.AbstractSessionPool`
471+
:returns: the session pool from the session manager
472+
"""
473+
return self._session_manager._pool
474+
475+
def session(self, labels=None, database_role=None):
476+
"""Factory to create a session.
477+
478+
:type labels: dict (str -> str)
479+
:param labels: (Optional) user-assigned labels for the session.
480+
481+
:type database_role: str
482+
:param database_role: (Optional) user-assigned database_role for the session.
483+
484+
:rtype: :class:`~google.cloud.spanner_v1.session.Session`
485+
:returns: a new session bound to this database.
486+
"""
487+
from google.cloud.spanner_v1.session import Session
488+
489+
session_labels = labels or {}
490+
session_database_role = database_role or self.database_role
491+
492+
return Session(
493+
database=self,
494+
labels=session_labels,
495+
database_role=session_database_role
496+
)
497+
470498
def metadata_with_request_id(
471499
self, nth_request, nth_attempt, prior_metadata=[], span=None
472500
):

google/cloud/spanner_v1/database_sessions_manager.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class DatabaseSessionsManager(object):
4646

4747
def __init__(self, database, pool):
4848
self._database = database
49-
self._logger = database.logger
49+
self._logger = None # Lazy initialization to avoid triggering database.logger during __init__
5050

5151
# The session pool manages non-multiplexed sessions, and
5252
# will only be used if multiplexed sessions are not enabled.
@@ -64,6 +64,13 @@ def __init__(self, database, pool):
6464
self._multiplexed_session_lock = threading.Lock()
6565
self._is_multiplexed_sessions_disabled_event = threading.Event()
6666

67+
@property
68+
def logger(self):
69+
"""Get the logger, initializing it lazily to avoid triggering database.logger during __init__."""
70+
if self._logger is None:
71+
self._logger = self._database.logger
72+
return self._logger
73+
6774
def get_session(self, transaction_type: TransactionType) -> Session:
6875
"""Returns a session for the given transaction type from the database session manager.
6976
:rtype: :class:`~google.cloud.spanner_v1.session.Session`
@@ -157,7 +164,7 @@ def _build_multiplexed_session(self) -> Session:
157164

158165
session.create()
159166

160-
self._logger.info("Created multiplexed session.")
167+
self.logger.info("Created multiplexed session.")
161168

162169
return session
163170

@@ -169,12 +176,12 @@ def _disable_multiplexed_sessions(self) -> None:
169176
self._multiplexed_session.delete()
170177
except Exception as exc: # noqa: BLE001
171178
# Keep the client alive; best-effort cleanup.
172-
self._logger.warning(
179+
self.logger.warning(
173180
"Failed to delete multiplexed session during disable: %s", exc
174181
)
175182
self._multiplexed_session = None
176183
self._is_multiplexed_sessions_disabled_event.set()
177-
self._database.session_options.disable_multiplexed(self._logger)
184+
self._database.session_options.disable_multiplexed(self.logger)
178185

179186
def _build_maintenance_thread(self) -> threading.Thread:
180187
"""Builds and returns a multiplexed session maintenance thread for
@@ -241,7 +248,7 @@ def _maintain_multiplexed_session(session_manager_ref) -> None:
241248
try:
242249
session_manager._multiplexed_session.delete()
243250
except Exception as exc: # noqa: BLE001
244-
session_manager._logger.warning(
251+
session_manager.logger.warning(
245252
"Failed to delete multiplexed session during refresh: %s", exc
246253
)
247254

google/cloud/spanner_v1/keyset.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
"""Wrap representation of Spanner keys / ranges."""
1616

17-
from google.cloud.spanner_v1 import KeyRangePB, KeySetPB
17+
from google.cloud.spanner_v1.types.keys import KeyRange as KeyRangePB, KeySet as KeySetPB
1818
from google.cloud.spanner_v1._helpers import _make_list_value_pb, _make_list_value_pbs
1919

2020

google/cloud/spanner_v1/metrics/spanner_metrics_tracer_factory.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@
3535
# Override Resource detector logging to not warn when GCP resources are not detected
3636
import logging
3737

38-
import mmh3
39-
4038
logging.getLogger("opentelemetry.resourcedetector.gcp_resource_detector").setLevel(
4139
logging.ERROR
4240
)
@@ -145,17 +143,27 @@ def _generate_client_hash(client_uid: str) -> str:
145143
"""
146144
if not client_uid:
147145
return "000000"
148-
hashed_client = mmh3.hash64(client_uid)
146+
147+
if not HAS_OPENTELEMETRY_INSTALLED:
148+
# Fallback to a simple hash if mmh3 is not available
149+
return f"{hash(client_uid) % 0xFFFFFF:06x}"
150+
151+
try:
152+
import mmh3
153+
hashed_client = mmh3.hash64(client_uid)
149154

150-
# Join the hashes back together since mmh3 splits into high and low 32bits
151-
full_hash = (hashed_client[0] << 32) | (hashed_client[1] & 0xFFFFFFFF)
152-
unsigned_hash = full_hash & 0xFFFFFFFFFFFFFFFF
155+
# Join the hashes back together since mmh3 splits into high and low 32bits
156+
full_hash = (hashed_client[0] << 32) | (hashed_client[1] & 0xFFFFFFFF)
157+
unsigned_hash = full_hash & 0xFFFFFFFFFFFFFFFF
153158

154-
k_prefix_length = 10
155-
sig_figs = unsigned_hash >> (64 - k_prefix_length)
159+
k_prefix_length = 10
160+
sig_figs = unsigned_hash >> (64 - k_prefix_length)
156161

157-
# Return as 6 digit zero padded hex string
158-
return f"{sig_figs:06x}"
162+
# Return as 6 digit zero padded hex string
163+
return f"{sig_figs:06x}"
164+
except ImportError:
165+
# Fallback to a simple hash if mmh3 is not available
166+
return f"{hash(client_uid) % 0xFFFFFF:06x}"
159167

160168
@staticmethod
161169
def _get_location() -> str:

google/cloud/spanner_v1/param_types.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from google.protobuf.internal.enum_type_wrapper import EnumTypeWrapper
1818
from google.protobuf.message import Message
1919

20-
from google.cloud.spanner_v1 import StructType, Type, TypeAnnotationCode, TypeCode
20+
from google.cloud.spanner_v1.types.type import StructType, Type, TypeAnnotationCode, TypeCode
2121

2222
# Scalar parameter types
2323
STRING = Type(code=TypeCode.STRING)

google/cloud/spanner_v1/pool.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
from warnings import warn
2121

2222
from google.cloud.exceptions import NotFound
23-
from google.cloud.spanner_v1 import BatchCreateSessionsRequest
24-
from google.cloud.spanner_v1 import Session as SessionPB
23+
from google.cloud.spanner_v1.types.spanner import BatchCreateSessionsRequest
24+
from google.cloud.spanner_v1.types import Session as SessionPB
2525
from google.cloud.spanner_v1._helpers import (
2626
_metadata_with_leader_aware_routing,
2727
_metadata_with_prefix,
@@ -131,9 +131,7 @@ def _new_session(self):
131131
:returns: new session instance.
132132
"""
133133
database_role = self.database_role or self._database.database_role
134-
return Session(
135-
database=self._database, labels=self.labels, database_role=database_role
136-
)
134+
return self._database.session(labels=self.labels, database_role=database_role)
137135

138136
def session(self, **kwargs):
139137
"""Return a context manager for a session from the pool.

0 commit comments

Comments
 (0)