Skip to content

Commit 7ee7537

Browse files
committed
Closed generator on cancel in PartialRowsData
1 parent 1ea5c89 commit 7ee7537

File tree

3 files changed

+29
-14
lines changed

3 files changed

+29
-14
lines changed

google/cloud/bigtable/row_data.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ def __init__(self, generator):
8484

8585
def cancel(self):
8686
"""Cancels the iterator, closing the stream."""
87-
self._cancelled = True
87+
self._generator.close()
8888

8989
def consume_all(self, max_loops=None):
9090
"""Consume the streamed responses until there are no more.
@@ -107,10 +107,7 @@ def __iter__(self):
107107
"""
108108
try:
109109
for row in self._generator:
110-
if self._cancelled:
111-
return
112-
else:
113-
yield PartialRowData._from_data_client_row(row)
110+
yield PartialRowData._from_data_client_row(row)
114111

115112
# Any exception from the generator should cancel the iterator. A
116113
# timeout, defined by catching a DeadlineExceeded, should be reraised

tests/system/v2_client/test_data_api.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -920,6 +920,7 @@ def test_table_read_rows_retry_timeout_mid_stream(
920920
rows_data = data_table_read_rows_retry_tests.read_rows(
921921
retry=DEFAULT_RETRY_READ_ROWS.with_deadline(10.0)
922922
)
923+
pytest.fail(str(type(rows_data._generator)))
923924
with pytest.raises(exceptions.RetryError):
924925
rows_data.consume_all()
925926

tests/unit/v2_client/test_row_data.py

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -466,12 +466,22 @@ def _partial_rows_data_consume_all(yrd):
466466
return [row.row_key for row in yrd]
467467

468468

469-
def _make_generator(rows):
470-
return (row for row in rows)
469+
def _make_generator(rows, error=None):
470+
for row in rows:
471+
if error:
472+
raise error
473+
else:
474+
yield row
475+
476+
477+
def _assert_generator_closed(generator):
478+
with pytest.raises(StopIteration):
479+
next(generator)
471480

472481

473482
def test_partial_rows_data_consume_all():
474-
partial_rows_data = _make_partial_rows_data(_make_generator(ROWS))
483+
generator = _make_generator(ROWS)
484+
partial_rows_data = _make_partial_rows_data(generator)
475485
partial_rows_data.consume_all()
476486

477487
row1 = _make_partial_row_data(ROW_KEY)
@@ -493,9 +503,12 @@ def test_partial_rows_data_consume_all():
493503
row3.row_key: row3,
494504
}
495505

506+
_assert_generator_closed(generator)
507+
496508

497509
def test_partial_rows_data_cancel():
498-
partial_rows_data = _make_partial_rows_data(_make_generator(ROWS))
510+
generator = _make_generator(ROWS)
511+
partial_rows_data = _make_partial_rows_data(generator)
499512
row_data = []
500513

501514
count = 0
@@ -511,18 +524,22 @@ def test_partial_rows_data_cancel():
511524
}
512525
assert row_data == [row1]
513526

527+
# We should have closed the generator, so there should be no more
528+
# elements left in there even though we haven't iterated through all the rows.
529+
_assert_generator_closed(generator)
530+
514531

515532
def test_partial_rows_data_deadline_exceeded():
516533
from google.api_core import exceptions
517534

518-
def generator_w_error():
519-
raise exceptions.DeadlineExceeded("Boom")
520-
yield 1
535+
generator = _make_generator(ROWS, error=exceptions.DeadlineExceeded("Operation timed out."))
521536

522-
partial_rows_data = _make_partial_rows_data(generator_w_error())
537+
partial_rows_data = _make_partial_rows_data(generator)
523538
with pytest.raises(exceptions.RetryError):
524539
list(partial_rows_data)
525-
assert partial_rows_data._cancelled
540+
541+
# An exception should close the generator.
542+
_assert_generator_closed(generator)
526543

527544

528545
def _make_cell_pb(value):

0 commit comments

Comments
 (0)