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

Commit 8f76434

Browse files
authored
fix: pass timeout to 'PartialRowsData.response_iterator' (#16)
1 parent 92386ec commit 8f76434

3 files changed

Lines changed: 19 additions & 3 deletions

File tree

google/cloud/bigtable/row_data.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,14 @@ def __init__(self, read_method, request, retry=DEFAULT_RETRY_READ_ROWS):
404404
self.read_method = read_method
405405
self.request = request
406406
self.retry = retry
407-
self.response_iterator = read_method(request)
407+
408+
# The `timeout` parameter must be somewhat greater than the value
409+
# contained in `self.retry`, in order to avoid race-like condition and
410+
# allow registering the first deadline error before invoking the retry.
411+
# Otherwise there is a risk of entering an infinite loop that resets
412+
# the timeout counter just before it being triggered. The increment
413+
# by 1 second here is customary but should not be much less than that.
414+
self.response_iterator = read_method(request, timeout=self.retry._deadline + 1)
408415

409416
self.rows = {}
410417
self._state = self.STATE_NEW_ROW

tests/unit/test_row_data.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -385,10 +385,16 @@ def test_constructor(self):
385385
self.assertEqual(partial_rows_data.retry, DEFAULT_RETRY_READ_ROWS)
386386

387387
def test_constructor_with_retry(self):
388+
from google.cloud.bigtable.row_data import DEFAULT_RETRY_READ_ROWS
389+
388390
client = _Client()
389391
client._data_stub = mock.MagicMock()
390-
request = retry = object()
392+
request = object()
393+
retry = DEFAULT_RETRY_READ_ROWS
391394
partial_rows_data = self._make_one(client._data_stub.ReadRows, request, retry)
395+
partial_rows_data.read_method.assert_called_once_with(
396+
request, timeout=DEFAULT_RETRY_READ_ROWS.deadline + 1
397+
)
392398
self.assertIs(partial_rows_data.request, request)
393399
self.assertEqual(partial_rows_data.rows, {})
394400
self.assertEqual(partial_rows_data.retry, retry)
@@ -471,6 +477,7 @@ def test_state_new_row_w_row(self):
471477
request = object()
472478

473479
yrd = self._make_one(client._table_data_client.transport.read_rows, request)
480+
self.assertEqual(yrd.retry._deadline, 60.0)
474481

475482
yrd._response_iterator = iterator
476483
rows = [row for row in yrd]

tests/unit/test_table.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -654,6 +654,7 @@ def test_read_rows(self):
654654
from google.cloud.bigtable import table as MUT
655655
from google.cloud.bigtable_v2.gapic import bigtable_client
656656
from google.cloud.bigtable_admin_v2.gapic import bigtable_table_admin_client
657+
from google.cloud.bigtable.row_data import DEFAULT_RETRY_READ_ROWS
657658

658659
data_api = bigtable_client.BigtableClient(mock.Mock())
659660
table_api = mock.create_autospec(
@@ -670,7 +671,8 @@ def test_read_rows(self):
670671
table = self._make_one(self.TABLE_ID, instance, app_profile_id=app_profile_id)
671672

672673
# Create request_pb
673-
request = retry = object() # Returned by our mock.
674+
request = object() # Returned by our mock.
675+
retry = DEFAULT_RETRY_READ_ROWS
674676
mock_created = []
675677

676678
def mock_create_row_request(table_name, **kwargs):

0 commit comments

Comments
 (0)