From 19d4eea2ec57d12dd4da60232832940aa7159fc5 Mon Sep 17 00:00:00 2001 From: ohmayr Date: Tue, 23 Jun 2026 16:15:44 +0000 Subject: [PATCH 1/4] chore(bigtable): fix flaky batcher flush interval test --- .../tests/unit/v2_client/test_batcher.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/google-cloud-bigtable/tests/unit/v2_client/test_batcher.py b/packages/google-cloud-bigtable/tests/unit/v2_client/test_batcher.py index 4090c3c81cea..101f3e97175a 100644 --- a/packages/google-cloud-bigtable/tests/unit/v2_client/test_batcher.py +++ b/packages/google-cloud-bigtable/tests/unit/v2_client/test_batcher.py @@ -175,23 +175,22 @@ def test_mutations_batcher_context_manager_flushed_when_closed(): assert table.mutation_calls == 1 +@mock.patch("google.cloud.bigtable.batcher.threading.Timer") @mock.patch("google.cloud.bigtable.batcher.MutationsBatcher.flush") -def test_mutations_batcher_flush_interval(mocked_flush): +def test_mutations_batcher_flush_interval(mocked_flush, mocked_timer): table = _Table(TABLE_NAME) flush_interval = 0.5 mutation_batcher = MutationsBatcher(table=table, flush_interval=flush_interval) - assert mutation_batcher._timer.interval == flush_interval + mocked_timer.assert_called_once_with(flush_interval, mutation_batcher.flush) + mocked_timer.return_value.start.assert_called_once_with() mocked_flush.assert_not_called() - time.sleep(0.4) - mocked_flush.assert_not_called() - - time.sleep(0.1) + # Manually invoke the timer callback to verify it calls flush + timer_callback = mocked_timer.call_args[0][1] + timer_callback() mocked_flush.assert_called_once_with() - mutation_batcher.close() - def test_mutations_batcher_response_with_error_codes(): from google.rpc.status_pb2 import Status From 5623fd0d0af3d534250ed1fd5da7ca955c239443 Mon Sep 17 00:00:00 2001 From: ohmayr Date: Tue, 23 Jun 2026 19:13:29 +0000 Subject: [PATCH 2/4] fix remaining flaky tests --- .../google-cloud-bigtable/tests/unit/data/_async/test_client.py | 2 +- .../tests/unit/data/_sync_autogen/test_client.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py b/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py index 8d2aa9872d01..534b5e61132b 100644 --- a/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py +++ b/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py @@ -2328,7 +2328,7 @@ async def mock_call(*args, **kwargs): starting_timeout - kwargs["operation_timeout"] for _, kwargs in read_rows.call_args_list ] - eps = 0.01 + eps = 0.2 # first 10 should start immediately assert all( rpc_start_list[i] < eps for i in range(_CONCURRENCY_LIMIT) diff --git a/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py b/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py index ca5158381774..2336f41117ab 100644 --- a/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py +++ b/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py @@ -1926,7 +1926,7 @@ def mock_call(*args, **kwargs): starting_timeout - kwargs["operation_timeout"] for _, kwargs in read_rows.call_args_list ] - eps = 0.01 + eps = 0.2 assert all( (rpc_start_list[i] < eps for i in range(_CONCURRENCY_LIMIT)) ) From 35b8920326c48214080b4e1e69b7eae9f665e81c Mon Sep 17 00:00:00 2001 From: ohmayr Date: Tue, 23 Jun 2026 19:17:02 +0000 Subject: [PATCH 3/4] fix lint --- .../tests/unit/v2_client/test_batcher.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/packages/google-cloud-bigtable/tests/unit/v2_client/test_batcher.py b/packages/google-cloud-bigtable/tests/unit/v2_client/test_batcher.py index 101f3e97175a..e0c8d18538a2 100644 --- a/packages/google-cloud-bigtable/tests/unit/v2_client/test_batcher.py +++ b/packages/google-cloud-bigtable/tests/unit/v2_client/test_batcher.py @@ -13,8 +13,6 @@ # limitations under the License. -import time - import mock import pytest @@ -175,22 +173,23 @@ def test_mutations_batcher_context_manager_flushed_when_closed(): assert table.mutation_calls == 1 -@mock.patch("google.cloud.bigtable.batcher.threading.Timer") @mock.patch("google.cloud.bigtable.batcher.MutationsBatcher.flush") -def test_mutations_batcher_flush_interval(mocked_flush, mocked_timer): +def test_mutations_batcher_flush_interval(mocked_flush): table = _Table(TABLE_NAME) flush_interval = 0.5 mutation_batcher = MutationsBatcher(table=table, flush_interval=flush_interval) - mocked_timer.assert_called_once_with(flush_interval, mutation_batcher.flush) - mocked_timer.return_value.start.assert_called_once_with() + assert mutation_batcher._timer.interval == flush_interval + mocked_flush.assert_not_called() + + time.sleep(0.4) mocked_flush.assert_not_called() - # Manually invoke the timer callback to verify it calls flush - timer_callback = mocked_timer.call_args[0][1] - timer_callback() + time.sleep(0.1) mocked_flush.assert_called_once_with() + mutation_batcher.close() + def test_mutations_batcher_response_with_error_codes(): from google.rpc.status_pb2 import Status From 85bce5842dfc2a0bc02cc539f65659504ef790e7 Mon Sep 17 00:00:00 2001 From: ohmayr Date: Tue, 23 Jun 2026 19:21:57 +0000 Subject: [PATCH 4/4] fix lint --- .../google-cloud-bigtable/tests/unit/v2_client/test_batcher.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/google-cloud-bigtable/tests/unit/v2_client/test_batcher.py b/packages/google-cloud-bigtable/tests/unit/v2_client/test_batcher.py index e0c8d18538a2..4090c3c81cea 100644 --- a/packages/google-cloud-bigtable/tests/unit/v2_client/test_batcher.py +++ b/packages/google-cloud-bigtable/tests/unit/v2_client/test_batcher.py @@ -13,6 +13,8 @@ # limitations under the License. +import time + import mock import pytest