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

Commit 4322bd6

Browse files
committed
Include batch*
1 parent 2c44ec8 commit 4322bd6

File tree

3 files changed

+43
-17
lines changed

3 files changed

+43
-17
lines changed

google/cloud/spanner_v1/batch.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
_metadata_with_prefix,
2727
_metadata_with_leader_aware_routing,
2828
_merge_Transaction_Options,
29+
AtomicCounter,
2930
)
3031
from google.cloud.spanner_v1._opentelemetry_tracing import trace_call
3132
from google.cloud.spanner_v1 import RequestOptions
@@ -249,17 +250,25 @@ def commit(
249250
observability_options=observability_options,
250251
metadata=metadata,
251252
), MetricsCapture():
252-
method = functools.partial(
253-
api.commit,
254-
request=request,
255-
metadata=metadata,
256-
)
253+
attempt = AtomicCounter()
254+
nth_request = getattr(database, "_next_nth_request", 0)
255+
256+
def wrapped_method(*args, **kwargs):
257+
method = functools.partial(
258+
api.commit,
259+
request=request,
260+
metadata=database.metadata_with_request_id(
261+
nth_request, attempt.increment(), metadata
262+
),
263+
)
264+
return method(*args, **kwargs)
265+
257266
deadline = time.time() + kwargs.get(
258267
"timeout_secs", DEFAULT_RETRY_TIMEOUT_SECS
259268
)
260269
default_retry_delay = kwargs.get("default_retry_delay", None)
261270
response = _retry_on_aborted_exception(
262-
method,
271+
wrapped_method,
263272
deadline=deadline,
264273
default_retry_delay=default_retry_delay,
265274
)

tests/unit/test_batch.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,10 @@
3838
from google.rpc.status_pb2 import Status
3939

4040
from google.cloud.spanner_v1._helpers import (
41+
AtomicCounter,
4142
_metadata_with_request_id,
4243
)
44+
from google.cloud.spanner_v1.request_id_header import REQ_RAND_PROCESS_ID
4345

4446
TABLE_NAME = "citizens"
4547
COLUMNS = ["email", "first_name", "last_name", "age"]
@@ -252,6 +254,10 @@ def test_commit_ok(self):
252254
[
253255
("google-cloud-resource-prefix", database.name),
254256
("x-goog-spanner-route-to-leader", "true"),
257+
(
258+
"x-goog-spanner-request-id",
259+
f"1.{REQ_RAND_PROCESS_ID}.{database._nth_client_id}.{database._channel_id}.1.1",
260+
),
255261
],
256262
)
257263
self.assertEqual(request_options, RequestOptions())
@@ -346,6 +352,10 @@ def _test_commit_with_options(
346352
[
347353
("google-cloud-resource-prefix", database.name),
348354
("x-goog-spanner-route-to-leader", "true"),
355+
(
356+
"x-goog-spanner-request-id",
357+
f"1.{REQ_RAND_PROCESS_ID}.{database._nth_client_id}.{database._channel_id}.1.1",
358+
),
349359
],
350360
)
351361
self.assertEqual(actual_request_options, expected_request_options)
@@ -456,6 +466,10 @@ def test_context_mgr_success(self):
456466
[
457467
("google-cloud-resource-prefix", database.name),
458468
("x-goog-spanner-route-to-leader", "true"),
469+
(
470+
"x-goog-spanner-request-id",
471+
f"1.{REQ_RAND_PROCESS_ID}.{database._nth_client_id}.{database._channel_id}.1.1",
472+
),
459473
],
460474
)
461475
self.assertEqual(request_options, RequestOptions())
@@ -582,12 +596,6 @@ def _test_batch_write_with_request_options(
582596
"traceparent is missing in metadata",
583597
)
584598

585-
# expected_metadata.append(
586-
# (
587-
# "x-goog-spanner-request-id",
588-
# f"1.{REQ_RAND_PROCESS_ID}.{database._nth_client_id}.1.1.1",
589-
# )
590-
# )
591599
# Remove traceparent from actual metadata for comparison
592600
filtered_metadata = [item for item in metadata if item[0] != "traceparent"]
593601

@@ -647,7 +655,7 @@ def session_id(self):
647655
class _Database(object):
648656
name = "testing"
649657
_route_to_leader_enabled = True
650-
NTH_CLIENT = 1
658+
NTH_CLIENT_ID = AtomicCounter()
651659

652660
def __init__(self, enable_end_to_end_tracing=False):
653661
self.name = "testing"
@@ -656,16 +664,13 @@ def __init__(self, enable_end_to_end_tracing=False):
656664
self.observability_options = dict(enable_end_to_end_tracing=True)
657665
self.default_transaction_options = DefaultTransactionOptions()
658666
self._nth_request = 0
667+
self._nth_client_id = _Database.NTH_CLIENT_ID.increment()
659668

660669
@property
661670
def _next_nth_request(self):
662671
self._nth_request += 1
663672
return self._nth_request
664673

665-
@property
666-
def _nth_client_id(self):
667-
return 1
668-
669674
def metadata_with_request_id(self, nth_request, nth_attempt, prior_metadata=[]):
670675
return _metadata_with_request_id(
671676
self._nth_client_id,

tests/unit/test_database.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2063,6 +2063,10 @@ def test_context_mgr_success(self):
20632063
metadata=[
20642064
("google-cloud-resource-prefix", database.name),
20652065
("x-goog-spanner-route-to-leader", "true"),
2066+
(
2067+
"x-goog-spanner-request-id",
2068+
f"1.{REQ_RAND_PROCESS_ID}.{database._nth_client_id}.{database._channel_id}.1.1",
2069+
),
20662070
],
20672071
)
20682072

@@ -2110,6 +2114,10 @@ def test_context_mgr_w_commit_stats_success(self):
21102114
metadata=[
21112115
("google-cloud-resource-prefix", database.name),
21122116
("x-goog-spanner-route-to-leader", "true"),
2117+
(
2118+
"x-goog-spanner-request-id",
2119+
f"1.{REQ_RAND_PROCESS_ID}.{database._nth_client_id}.{database._channel_id}.1.1",
2120+
),
21132121
],
21142122
)
21152123

@@ -2155,6 +2163,10 @@ def test_context_mgr_w_aborted_commit_status(self):
21552163
metadata=[
21562164
("google-cloud-resource-prefix", database.name),
21572165
("x-goog-spanner-route-to-leader", "true"),
2166+
(
2167+
"x-goog-spanner-request-id",
2168+
f"1.{REQ_RAND_PROCESS_ID}.{database._nth_client_id}.{database._channel_id}.1.1",
2169+
),
21582170
],
21592171
)
21602172

0 commit comments

Comments
 (0)