google-cloud-bigtable 2.44.0__tar.gz → 2.45.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {google_cloud_bigtable-2.44.0/google_cloud_bigtable.egg-info → google_cloud_bigtable-2.45.0}/PKG-INFO +1 -1
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/gapic_version.py +1 -1
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/table.py +94 -208
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin/gapic_version.py +1 -1
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/gapic_version.py +1 -1
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/gapic_version.py +1 -1
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0/google_cloud_bigtable.egg-info}/PKG-INFO +1 -1
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/v2_client/test_data_api.py +39 -66
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/v2_client/test_table.py +207 -640
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/LICENSE +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/MANIFEST.in +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/README.rst +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/app_profile.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/backup.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/batcher.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/client.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/cluster.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/column_family.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_async/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_async/_mutate_rows.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_async/_read_rows.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_async/_swappable_channel.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_async/client.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_async/metrics_interceptor.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_async/mutations_batcher.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_cross_sync/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_cross_sync/_decorators.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_cross_sync/_mapping_meta.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_cross_sync/cross_sync.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_helpers.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_metrics/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_metrics/data_model.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_metrics/handlers/_base.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_metrics/handlers/gcp_exporter.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_metrics/handlers/opentelemetry.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_metrics/metrics_controller.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_metrics/tracked_retry.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_sync_autogen/_mutate_rows.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_sync_autogen/_read_rows.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_sync_autogen/_swappable_channel.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_sync_autogen/client.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_sync_autogen/metrics_interceptor.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/_sync_autogen/mutations_batcher.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/exceptions.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/execute_query/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/execute_query/_async/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/execute_query/_async/execute_query_iterator.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/execute_query/_byte_cursor.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/execute_query/_checksum.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/execute_query/_parameters_formatting.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/execute_query/_query_result_parsing_utils.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/execute_query/_reader.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/execute_query/_sync_autogen/execute_query_iterator.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/execute_query/metadata.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/execute_query/values.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/mutations.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/read_modify_write_rules.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/read_rows_query.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/row.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/data/row_filters.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/encryption_info.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/enums.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/error.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/helpers.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/instance.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/policy.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/py.typed +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/row.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/row_data.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/row_filters.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/row_merger.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/row_set.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin/py.typed +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/_compat.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/gapic_metadata.json +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/overlay/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/overlay/services/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/overlay/services/bigtable_table_admin/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/overlay/services/bigtable_table_admin/async_client.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/overlay/services/bigtable_table_admin/client.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/overlay/types/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/overlay/types/async_consistency.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/overlay/types/async_restore_table.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/overlay/types/consistency.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/overlay/types/restore_table.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/overlay/types/wait_for_consistency_request.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/py.typed +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/async_client.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/client.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/pagers.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/transports/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/transports/base.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/transports/grpc.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/transports/grpc_asyncio.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/transports/rest.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/transports/rest_base.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/async_client.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/client.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/pagers.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/transports/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/transports/base.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/transports/grpc.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/transports/grpc_asyncio.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/transports/rest.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/transports/rest_base.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/types/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/types/bigtable_instance_admin.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/types/bigtable_table_admin.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/types/common.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/types/instance.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/types/table.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/types/types.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/utils/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_admin_v2/utils/oneof_message.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/_compat.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/gapic_metadata.json +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/py.typed +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/services/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/services/bigtable/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/services/bigtable/async_client.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/services/bigtable/client.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/services/bigtable/transports/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/services/bigtable/transports/base.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/services/bigtable/transports/grpc.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/services/bigtable/transports/grpc_asyncio.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/services/bigtable/transports/rest.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/services/bigtable/transports/rest_base.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/types/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/types/bigtable.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/types/data.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/types/feature_flags.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/types/peer_info.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/types/request_stats.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/types/response_params.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/types/session.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable_v2/types/types.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google_cloud_bigtable.egg-info/SOURCES.txt +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google_cloud_bigtable.egg-info/dependency_links.txt +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google_cloud_bigtable.egg-info/not-zip-safe +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google_cloud_bigtable.egg-info/requires.txt +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google_cloud_bigtable.egg-info/top_level.txt +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/setup.cfg +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/setup.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/admin_overlay/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/admin_overlay/conftest.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/admin_overlay/test_system_async.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/admin_overlay/test_system_autogen.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/conftest.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/cross_sync/test_cases/async_to_sync.yaml +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/cross_sync/test_cases/cross_sync_files.yaml +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/cross_sync/test_cases/rm_aio.yaml +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/cross_sync/test_cases/strip_async_conditional_branches.yaml +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/cross_sync/test_cases/symbol_replacer.yaml +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/cross_sync/test_cross_sync_e2e.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/data/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/data/test_metrics_async.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/data/test_metrics_autogen.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/data/test_system_async.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/data/test_system_autogen.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/utils.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/v2_client/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/v2_client/_helpers.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/v2_client/conftest.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/v2_client/test_instance_admin.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/system/v2_client/test_table_admin.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/admin_overlay/my_oneof_message.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/admin_overlay/test_admin_packaging.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/admin_overlay/test_async_client.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/admin_overlay/test_async_consistency.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/admin_overlay/test_async_restore_table.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/admin_overlay/test_client.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/admin_overlay/test_consistency.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/admin_overlay/test_oneof_message.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/admin_overlay/test_restore_table.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/conftest.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_async/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_async/test__mutate_rows.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_async/test__read_rows.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_async/test__swappable_channel.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_async/test_client.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_async/test_metrics_interceptor.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_async/test_mutations_batcher.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_async/test_read_rows_acceptance.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_cross_sync/test_cross_sync.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_cross_sync/test_cross_sync_decorators.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_metrics/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_metrics/test_data_model.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_metrics/test_gcp_exporter_handler.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_metrics/test_metrics_controller.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_metrics/test_opentelemetry_handler.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_metrics/test_tracked_retry.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_sync_autogen/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_sync_autogen/test__mutate_rows.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_sync_autogen/test__read_rows.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_sync_autogen/test__swappable_channel.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_sync_autogen/test_client.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_sync_autogen/test_metrics_interceptor.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_sync_autogen/test_mutations_batcher.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/_sync_autogen/test_read_rows_acceptance.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/execute_query/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/execute_query/_async/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/execute_query/_async/test_query_iterator.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/execute_query/_sync_autogen/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/execute_query/_sync_autogen/test_query_iterator.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/execute_query/resources/README.md +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/execute_query/resources/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/execute_query/resources/descriptors.pb +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/execute_query/resources/singer.proto +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/execute_query/resources/singer_pb2.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/execute_query/sql_helpers.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/execute_query/test_byte_cursor.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/execute_query/test_checksum.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/execute_query/test_execute_query_parameters_parsing.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/execute_query/test_metadata.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/execute_query/test_query_result_parsing_utils.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/execute_query/test_query_result_row_reader.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/read-rows-acceptance-test.json +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/test__helpers.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/test_exceptions.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/test_helpers.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/test_mutations.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/test_read_modify_write_rules.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/test_read_rows_query.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/test_row.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/test_row_filters.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/data/test_sync_up_to_date.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/gapic/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/gapic/bigtable_admin_v2/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/gapic/bigtable_admin_v2/test_bigtable_instance_admin.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/gapic/bigtable_admin_v2/test_bigtable_table_admin.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/gapic/bigtable_admin_v2/test_compat.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/gapic/bigtable_v2/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/gapic/bigtable_v2/test_bigtable.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/gapic/bigtable_v2/test_compat.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/test_packaging.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/test_sql_routing_parameters.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/v2_client/__init__.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/v2_client/_testing.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/v2_client/read-rows-acceptance-test.json +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/v2_client/test_app_profile.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/v2_client/test_backup.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/v2_client/test_batcher.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/v2_client/test_client.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/v2_client/test_cluster.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/v2_client/test_column_family.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/v2_client/test_encryption_info.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/v2_client/test_error.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/v2_client/test_instance.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/v2_client/test_policy.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/v2_client/test_row.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/v2_client/test_row_data.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/v2_client/test_row_filters.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/v2_client/test_row_merger.py +0 -0
- {google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/tests/unit/v2_client/test_row_set.py +0 -0
{google_cloud_bigtable-2.44.0 → google_cloud_bigtable-2.45.0}/google/cloud/bigtable/table.py
RENAMED
|
@@ -17,18 +17,18 @@
|
|
|
17
17
|
import warnings
|
|
18
18
|
from typing import Set
|
|
19
19
|
|
|
20
|
-
from google.api_core import timeout
|
|
21
20
|
from google.api_core.exceptions import (
|
|
22
21
|
Aborted,
|
|
23
22
|
DeadlineExceeded,
|
|
23
|
+
GoogleAPICallError,
|
|
24
24
|
InternalServerError,
|
|
25
25
|
NotFound,
|
|
26
|
-
RetryError,
|
|
27
26
|
ServiceUnavailable,
|
|
28
27
|
)
|
|
29
28
|
from google.api_core.gapic_v1.method import DEFAULT
|
|
30
29
|
from google.api_core.retry import Retry, if_exception_type
|
|
31
30
|
from google.cloud._helpers import _to_bytes # type: ignore
|
|
31
|
+
from google.rpc import code_pb2, status_pb2
|
|
32
32
|
|
|
33
33
|
from google.cloud.bigtable import enums
|
|
34
34
|
from google.cloud.bigtable.backup import Backup
|
|
@@ -38,13 +38,18 @@ from google.cloud.bigtable.batcher import (
|
|
|
38
38
|
MutationsBatcher,
|
|
39
39
|
)
|
|
40
40
|
from google.cloud.bigtable.column_family import ColumnFamily, _gc_rule_from_pb
|
|
41
|
+
from google.cloud.bigtable.data._helpers import TABLE_DEFAULT
|
|
42
|
+
from google.cloud.bigtable.data.exceptions import (
|
|
43
|
+
MutationsExceptionGroup,
|
|
44
|
+
RetryExceptionGroup,
|
|
45
|
+
)
|
|
46
|
+
from google.cloud.bigtable.data.mutations import RowMutationEntry
|
|
41
47
|
from google.cloud.bigtable.encryption_info import EncryptionInfo
|
|
42
48
|
from google.cloud.bigtable.policy import Policy
|
|
43
49
|
from google.cloud.bigtable.row import AppendRow, ConditionalRow, DirectRow
|
|
44
50
|
from google.cloud.bigtable.row_data import (
|
|
45
51
|
DEFAULT_RETRY_READ_ROWS,
|
|
46
52
|
PartialRowsData,
|
|
47
|
-
_retriable_internal_server_error,
|
|
48
53
|
)
|
|
49
54
|
from google.cloud.bigtable.row_set import RowRange, RowSet
|
|
50
55
|
from google.cloud.bigtable_admin_v2 import BaseBigtableTableAdminClient
|
|
@@ -563,7 +568,7 @@ class Table(object):
|
|
|
563
568
|
default value :attr:`DEFAULT_RETRY_READ_ROWS` can be used and
|
|
564
569
|
modified with the :meth:`~google.api_core.retry.Retry.with_delay`
|
|
565
570
|
method or the :meth:`~google.api_core.retry.Retry.with_deadline`
|
|
566
|
-
method.
|
|
571
|
+
method. Custom on_error and predicate values will be ignored.
|
|
567
572
|
|
|
568
573
|
:rtype: :class:`.PartialRowData`, :data:`NoneType <types.NoneType>`
|
|
569
574
|
:returns: The contents of the row if any chunks were returned in
|
|
@@ -634,7 +639,7 @@ class Table(object):
|
|
|
634
639
|
default value :attr:`DEFAULT_RETRY_READ_ROWS` can be used and
|
|
635
640
|
modified with the :meth:`~google.api_core.retry.Retry.with_delay`
|
|
636
641
|
method or the :meth:`~google.api_core.retry.Retry.with_deadline`
|
|
637
|
-
method.
|
|
642
|
+
method. Custom on_error and predicate values will be ignored.
|
|
638
643
|
|
|
639
644
|
:rtype: :class:`.PartialRowsData`
|
|
640
645
|
:returns: A :class:`.PartialRowsData` a generator for consuming
|
|
@@ -715,6 +720,9 @@ class Table(object):
|
|
|
715
720
|
specify a ``retry`` strategy of "do-nothing", a deadline of ``0.0``
|
|
716
721
|
can be specified.
|
|
717
722
|
|
|
723
|
+
If a deadline of ``None`` is specified, the deadline defaults to
|
|
724
|
+
a table-default of 600 seconds (10 minutes).
|
|
725
|
+
|
|
718
726
|
:type rows: list
|
|
719
727
|
:param rows: List or other iterable of :class:`.DirectRow` instances.
|
|
720
728
|
|
|
@@ -723,7 +731,8 @@ class Table(object):
|
|
|
723
731
|
(Optional) Retry delay and deadline arguments. To override, the
|
|
724
732
|
default value :attr:`DEFAULT_RETRY` can be used and modified with
|
|
725
733
|
the :meth:`~google.api_core.retry.Retry.with_delay` method or the
|
|
726
|
-
:meth:`~google.api_core.retry.Retry.with_deadline` method.
|
|
734
|
+
:meth:`~google.api_core.retry.Retry.with_deadline` method. Custom
|
|
735
|
+
on_error and predicate values will be ignored.
|
|
727
736
|
|
|
728
737
|
:type timeout: float
|
|
729
738
|
:param timeout: number of seconds bounding retries for the call
|
|
@@ -732,18 +741,90 @@ class Table(object):
|
|
|
732
741
|
:returns: A list of response statuses (`google.rpc.status_pb2.Status`)
|
|
733
742
|
corresponding to success or failure of each row mutation
|
|
734
743
|
sent. These will be in the same order as the `rows`.
|
|
744
|
+
|
|
745
|
+
:raise: ValueError: If a row entry has no mutations, or too many mutations
|
|
735
746
|
"""
|
|
736
747
|
if timeout is DEFAULT:
|
|
737
748
|
timeout = self.mutation_timeout
|
|
738
749
|
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
750
|
+
retryable_errors = RETRYABLE_MUTATION_ERRORS
|
|
751
|
+
|
|
752
|
+
# The data client cannot take in zero or null values for deadline, so we set it to
|
|
753
|
+
# the default if that is the case.
|
|
754
|
+
if retry is None:
|
|
755
|
+
operation_timeout = TABLE_DEFAULT.MUTATE_ROWS
|
|
756
|
+
retryable_errors = []
|
|
757
|
+
elif retry.deadline is None:
|
|
758
|
+
operation_timeout = TABLE_DEFAULT.MUTATE_ROWS
|
|
759
|
+
|
|
760
|
+
# To adhere to the retry strategy of do-nothing being achievable with a deadline
|
|
761
|
+
# of 0.0, we modify the retryable errors to be empty if such a deadline is passed.
|
|
762
|
+
elif retry.deadline == 0:
|
|
763
|
+
operation_timeout = TABLE_DEFAULT.MUTATE_ROWS
|
|
764
|
+
retryable_errors = []
|
|
765
|
+
else:
|
|
766
|
+
operation_timeout = retry.deadline
|
|
767
|
+
|
|
768
|
+
attempt_timeout = timeout
|
|
769
|
+
mutation_entries = []
|
|
770
|
+
for row in rows:
|
|
771
|
+
if not isinstance(row, DirectRow):
|
|
772
|
+
raise TypeError(
|
|
773
|
+
"Bulk processing can not be applied for conditional or append mutations."
|
|
774
|
+
)
|
|
775
|
+
if row.table is not None and row.table.name != self.name:
|
|
776
|
+
raise TableMismatchError(
|
|
777
|
+
"Row %s is a part of %s table. Current table: %s"
|
|
778
|
+
% (row.row_key, row.table.name, self.name)
|
|
779
|
+
)
|
|
780
|
+
mutation_entries.append(RowMutationEntry(row.row_key, row._get_mutations()))
|
|
781
|
+
return_statuses = [
|
|
782
|
+
status_pb2.Status(code=code_pb2.OK) for _ in range(len(mutation_entries))
|
|
783
|
+
] # By default, return status OKs for everything
|
|
784
|
+
|
|
785
|
+
try:
|
|
786
|
+
self._table_impl.bulk_mutate_rows(
|
|
787
|
+
mutation_entries,
|
|
788
|
+
operation_timeout=operation_timeout,
|
|
789
|
+
attempt_timeout=attempt_timeout,
|
|
790
|
+
retryable_errors=retryable_errors,
|
|
791
|
+
)
|
|
792
|
+
except MutationsExceptionGroup as mut_exc_group:
|
|
793
|
+
# We exception handle as follows:
|
|
794
|
+
#
|
|
795
|
+
# 1. Each exception in the error group is a FailedMutationEntryError, and its
|
|
796
|
+
# cause is either a singular exception or a RetryExceptionGroup consisting of
|
|
797
|
+
# multiple exceptions.
|
|
798
|
+
#
|
|
799
|
+
# 2. In the case of a singular exception, if the error does not have a gRPC status
|
|
800
|
+
# code, we return a status code of UNKNOWN.
|
|
801
|
+
#
|
|
802
|
+
# 3. In the case of a RetryExceptionGroup, we use terminal exception in the exception
|
|
803
|
+
# group and process that.
|
|
804
|
+
for error in mut_exc_group.exceptions:
|
|
805
|
+
cause = error.__cause__
|
|
806
|
+
if isinstance(cause, RetryExceptionGroup):
|
|
807
|
+
return_statuses[error.index] = self._get_status(
|
|
808
|
+
cause.exceptions[-1]
|
|
809
|
+
)
|
|
810
|
+
else:
|
|
811
|
+
return_statuses[error.index] = self._get_status(cause)
|
|
812
|
+
|
|
813
|
+
return return_statuses
|
|
814
|
+
|
|
815
|
+
@staticmethod
|
|
816
|
+
def _get_status(error):
|
|
817
|
+
if isinstance(error, GoogleAPICallError) and error.grpc_status_code is not None:
|
|
818
|
+
return status_pb2.Status(
|
|
819
|
+
code=error.grpc_status_code.value[0],
|
|
820
|
+
message=error.message,
|
|
821
|
+
details=error.details,
|
|
822
|
+
)
|
|
823
|
+
|
|
824
|
+
return status_pb2.Status(
|
|
825
|
+
code=code_pb2.UNKNOWN,
|
|
826
|
+
message=str(error),
|
|
745
827
|
)
|
|
746
|
-
return retryable_mutate_rows(retry=retry)
|
|
747
828
|
|
|
748
829
|
def sample_row_keys(self):
|
|
749
830
|
"""Read a sample of row keys in the table.
|
|
@@ -1078,133 +1159,6 @@ class Table(object):
|
|
|
1078
1159
|
)
|
|
1079
1160
|
|
|
1080
1161
|
|
|
1081
|
-
class _RetryableMutateRowsWorker(object):
|
|
1082
|
-
"""A callable worker that can retry to mutate rows with transient errors.
|
|
1083
|
-
|
|
1084
|
-
This class is a callable that can retry mutating rows that result in
|
|
1085
|
-
transient errors. After all rows are successful or none of the rows
|
|
1086
|
-
are retryable, any subsequent call on this callable will be a no-op.
|
|
1087
|
-
"""
|
|
1088
|
-
|
|
1089
|
-
def __init__(self, client, table_name, rows, app_profile_id=None, timeout=None):
|
|
1090
|
-
self.client = client
|
|
1091
|
-
self.table_name = table_name
|
|
1092
|
-
self.rows = rows
|
|
1093
|
-
self.app_profile_id = app_profile_id
|
|
1094
|
-
self.responses_statuses = [None] * len(self.rows)
|
|
1095
|
-
self.timeout = timeout
|
|
1096
|
-
|
|
1097
|
-
def __call__(self, retry=DEFAULT_RETRY):
|
|
1098
|
-
"""Attempt to mutate all rows and retry rows with transient errors.
|
|
1099
|
-
|
|
1100
|
-
Will retry the rows with transient errors until all rows succeed or
|
|
1101
|
-
``deadline`` specified in the `retry` is reached.
|
|
1102
|
-
|
|
1103
|
-
:rtype: list
|
|
1104
|
-
:returns: A list of response statuses (`google.rpc.status_pb2.Status`)
|
|
1105
|
-
corresponding to success or failure of each row mutation
|
|
1106
|
-
sent. These will be in the same order as the ``rows``.
|
|
1107
|
-
"""
|
|
1108
|
-
mutate_rows = self._do_mutate_retryable_rows
|
|
1109
|
-
if retry:
|
|
1110
|
-
mutate_rows = retry(self._do_mutate_retryable_rows)
|
|
1111
|
-
|
|
1112
|
-
try:
|
|
1113
|
-
mutate_rows()
|
|
1114
|
-
except (_BigtableRetryableError, RetryError):
|
|
1115
|
-
# - _BigtableRetryableError raised when no retry strategy is used
|
|
1116
|
-
# and a retryable error on a mutation occurred.
|
|
1117
|
-
# - RetryError raised when retry deadline is reached.
|
|
1118
|
-
# In both cases, just return current `responses_statuses`.
|
|
1119
|
-
pass
|
|
1120
|
-
|
|
1121
|
-
return self.responses_statuses
|
|
1122
|
-
|
|
1123
|
-
@staticmethod
|
|
1124
|
-
def _is_retryable(status):
|
|
1125
|
-
return status is None or status.code in RETRYABLE_CODES
|
|
1126
|
-
|
|
1127
|
-
def _do_mutate_retryable_rows(self):
|
|
1128
|
-
"""Mutate all the rows that are eligible for retry.
|
|
1129
|
-
|
|
1130
|
-
A row is eligible for retry if it has not been tried or if it resulted
|
|
1131
|
-
in a transient error in a previous call.
|
|
1132
|
-
|
|
1133
|
-
:rtype: list
|
|
1134
|
-
:return: The responses statuses, which is a list of
|
|
1135
|
-
:class:`~google.rpc.status_pb2.Status`.
|
|
1136
|
-
:raises: One of the following:
|
|
1137
|
-
|
|
1138
|
-
* :exc:`~.table._BigtableRetryableError` if any
|
|
1139
|
-
row returned a transient error.
|
|
1140
|
-
* :exc:`RuntimeError` if the number of responses doesn't
|
|
1141
|
-
match the number of rows that were retried
|
|
1142
|
-
"""
|
|
1143
|
-
retryable_rows = []
|
|
1144
|
-
index_into_all_rows = []
|
|
1145
|
-
for index, status in enumerate(self.responses_statuses):
|
|
1146
|
-
if self._is_retryable(status):
|
|
1147
|
-
retryable_rows.append(self.rows[index])
|
|
1148
|
-
index_into_all_rows.append(index)
|
|
1149
|
-
|
|
1150
|
-
if not retryable_rows:
|
|
1151
|
-
# All mutations are either successful or non-retryable now.
|
|
1152
|
-
return self.responses_statuses
|
|
1153
|
-
|
|
1154
|
-
entries = _compile_mutation_entries(self.table_name, retryable_rows)
|
|
1155
|
-
data_client = self.client.table_data_client
|
|
1156
|
-
|
|
1157
|
-
kwargs = {}
|
|
1158
|
-
if self.timeout is not None:
|
|
1159
|
-
kwargs["timeout"] = timeout.ExponentialTimeout(deadline=self.timeout)
|
|
1160
|
-
|
|
1161
|
-
try:
|
|
1162
|
-
responses = data_client.mutate_rows(
|
|
1163
|
-
table_name=self.table_name,
|
|
1164
|
-
entries=entries,
|
|
1165
|
-
app_profile_id=self.app_profile_id,
|
|
1166
|
-
retry=None,
|
|
1167
|
-
**kwargs,
|
|
1168
|
-
)
|
|
1169
|
-
except RETRYABLE_MUTATION_ERRORS as exc:
|
|
1170
|
-
# If an exception, considered retryable by `RETRYABLE_MUTATION_ERRORS`, is
|
|
1171
|
-
# returned from the initial call, consider
|
|
1172
|
-
# it to be retryable. Wrap as a Bigtable Retryable Error.
|
|
1173
|
-
# For InternalServerError, it is only retriable if the message is related to RST Stream messages
|
|
1174
|
-
if _retriable_internal_server_error(exc) or not isinstance(
|
|
1175
|
-
exc, InternalServerError
|
|
1176
|
-
):
|
|
1177
|
-
raise _BigtableRetryableError
|
|
1178
|
-
else:
|
|
1179
|
-
# re-raise the original exception
|
|
1180
|
-
raise
|
|
1181
|
-
|
|
1182
|
-
num_responses = 0
|
|
1183
|
-
num_retryable_responses = 0
|
|
1184
|
-
for response in responses:
|
|
1185
|
-
for entry in response.entries:
|
|
1186
|
-
num_responses += 1
|
|
1187
|
-
index = index_into_all_rows[entry.index]
|
|
1188
|
-
self.responses_statuses[index] = entry.status
|
|
1189
|
-
if self._is_retryable(entry.status):
|
|
1190
|
-
num_retryable_responses += 1
|
|
1191
|
-
if entry.status.code == 0:
|
|
1192
|
-
self.rows[index].clear()
|
|
1193
|
-
|
|
1194
|
-
if len(retryable_rows) != num_responses:
|
|
1195
|
-
raise RuntimeError(
|
|
1196
|
-
"Unexpected number of responses",
|
|
1197
|
-
num_responses,
|
|
1198
|
-
"Expected",
|
|
1199
|
-
len(retryable_rows),
|
|
1200
|
-
)
|
|
1201
|
-
|
|
1202
|
-
if num_retryable_responses:
|
|
1203
|
-
raise _BigtableRetryableError
|
|
1204
|
-
|
|
1205
|
-
return self.responses_statuses
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
1162
|
class ClusterState(object):
|
|
1209
1163
|
"""Representation of a Cluster State.
|
|
1210
1164
|
|
|
@@ -1351,71 +1305,3 @@ def _create_row_request(
|
|
|
1351
1305
|
row_set._update_message_request(message)
|
|
1352
1306
|
|
|
1353
1307
|
return message
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
def _compile_mutation_entries(table_name, rows):
|
|
1357
|
-
"""Create list of mutation entries
|
|
1358
|
-
|
|
1359
|
-
:type table_name: str
|
|
1360
|
-
:param table_name: The name of the table to write to.
|
|
1361
|
-
|
|
1362
|
-
:type rows: list
|
|
1363
|
-
:param rows: List or other iterable of :class:`.DirectRow` instances.
|
|
1364
|
-
|
|
1365
|
-
:rtype: List[:class:`data_messages_v2_pb2.MutateRowsRequest.Entry`]
|
|
1366
|
-
:returns: entries corresponding to the inputs.
|
|
1367
|
-
:raises: :exc:`~.table.TooManyMutationsError` if the number of mutations is
|
|
1368
|
-
greater than the max ({})
|
|
1369
|
-
""".format(_MAX_BULK_MUTATIONS)
|
|
1370
|
-
entries = []
|
|
1371
|
-
mutations_count = 0
|
|
1372
|
-
entry_klass = data_messages_v2_pb2.MutateRowsRequest.Entry
|
|
1373
|
-
|
|
1374
|
-
for row in rows:
|
|
1375
|
-
_check_row_table_name(table_name, row)
|
|
1376
|
-
_check_row_type(row)
|
|
1377
|
-
mutations = row._get_mutation_pbs()
|
|
1378
|
-
entries.append(entry_klass(row_key=row.row_key, mutations=mutations))
|
|
1379
|
-
mutations_count += len(mutations)
|
|
1380
|
-
|
|
1381
|
-
if mutations_count > _MAX_BULK_MUTATIONS:
|
|
1382
|
-
raise TooManyMutationsError(
|
|
1383
|
-
"Maximum number of mutations is %s" % (_MAX_BULK_MUTATIONS,)
|
|
1384
|
-
)
|
|
1385
|
-
return entries
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
def _check_row_table_name(table_name, row):
|
|
1389
|
-
"""Checks that a row belongs to a table.
|
|
1390
|
-
|
|
1391
|
-
:type table_name: str
|
|
1392
|
-
:param table_name: The name of the table.
|
|
1393
|
-
|
|
1394
|
-
:type row: :class:`~google.cloud.bigtable.row.Row`
|
|
1395
|
-
:param row: An instance of :class:`~google.cloud.bigtable.row.Row`
|
|
1396
|
-
subclasses.
|
|
1397
|
-
|
|
1398
|
-
:raises: :exc:`~.table.TableMismatchError` if the row does not belong to
|
|
1399
|
-
the table.
|
|
1400
|
-
"""
|
|
1401
|
-
if row.table is not None and row.table.name != table_name:
|
|
1402
|
-
raise TableMismatchError(
|
|
1403
|
-
"Row %s is a part of %s table. Current table: %s"
|
|
1404
|
-
% (row.row_key, row.table.name, table_name)
|
|
1405
|
-
)
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
def _check_row_type(row):
|
|
1409
|
-
"""Checks that a row is an instance of :class:`.DirectRow`.
|
|
1410
|
-
|
|
1411
|
-
:type row: :class:`~google.cloud.bigtable.row.Row`
|
|
1412
|
-
:param row: An instance of :class:`~google.cloud.bigtable.row.Row`
|
|
1413
|
-
subclasses.
|
|
1414
|
-
|
|
1415
|
-
:raises: :class:`TypeError <exceptions.TypeError>` if the row is not an
|
|
1416
|
-
instance of DirectRow.
|
|
1417
|
-
"""
|
|
1418
|
-
if not isinstance(row, DirectRow):
|
|
1419
|
-
raise TypeError(
|
|
1420
|
-
"Bulk processing can not be applied for conditional or append mutations."
|
|
1421
|
-
)
|
|
@@ -275,43 +275,12 @@ def test_table_mutate_rows(data_table, rows_to_delete):
|
|
|
275
275
|
assert row2_data.cells[COLUMN_FAMILY_ID1][COL_NAME1][0].value == CELL_VAL4
|
|
276
276
|
|
|
277
277
|
|
|
278
|
-
def _add_test_error_handler(retry):
|
|
279
|
-
"""Overwrites the current on_error function to assert that backoff values are within expected bounds."""
|
|
280
|
-
import time
|
|
281
|
-
|
|
282
|
-
curr_time = time.monotonic()
|
|
283
|
-
times_triggered = 0
|
|
284
|
-
|
|
285
|
-
# Assert that the retry handler works properly.
|
|
286
|
-
def test_error_handler(exc):
|
|
287
|
-
nonlocal curr_time, times_triggered
|
|
288
|
-
next_time = time.monotonic()
|
|
289
|
-
if times_triggered >= 1:
|
|
290
|
-
gap = next_time - curr_time
|
|
291
|
-
|
|
292
|
-
# Exponential backoff = uniform randomness from 0 to max_gap
|
|
293
|
-
max_gap = min(
|
|
294
|
-
retry._initial * retry._multiplier**times_triggered,
|
|
295
|
-
retry._maximum,
|
|
296
|
-
)
|
|
297
|
-
# Allow a small tolerance margin (1.0s) for OS sleep scheduling latency
|
|
298
|
-
assert gap <= max_gap + 1.0
|
|
299
|
-
times_triggered += 1
|
|
300
|
-
curr_time = next_time
|
|
301
|
-
|
|
302
|
-
retry._on_error = test_error_handler
|
|
303
|
-
|
|
304
|
-
|
|
305
278
|
def test_table_mutate_rows_retries_timeout(data_table, rows_to_delete):
|
|
306
|
-
import copy
|
|
307
|
-
|
|
308
279
|
import mock
|
|
309
|
-
from google.api_core import retry as retries
|
|
310
|
-
from google.api_core.exceptions import InvalidArgument
|
|
311
280
|
from google.rpc.code_pb2 import Code
|
|
312
281
|
from google.rpc.status_pb2 import Status
|
|
313
282
|
|
|
314
|
-
from google.cloud.bigtable.table import DEFAULT_RETRY
|
|
283
|
+
from google.cloud.bigtable.table import DEFAULT_RETRY
|
|
315
284
|
from google.cloud.bigtable_v2 import MutateRowsResponse
|
|
316
285
|
|
|
317
286
|
# Simulate a server error on row 2, and a normal response on row 1, followed by a bunch of error
|
|
@@ -346,6 +315,9 @@ def test_table_mutate_rows_retries_timeout(data_table, rows_to_delete):
|
|
|
346
315
|
|
|
347
316
|
final_success_response = [MutateRowsResponse(entries=[MutateRowsResponse.Entry()])]
|
|
348
317
|
|
|
318
|
+
# Explicit timestamp ensures mutations are idempotent and eligible for retry.
|
|
319
|
+
timestamp = datetime(2023, 1, 1, tzinfo=timezone.utc)
|
|
320
|
+
|
|
349
321
|
with mock.patch.object(
|
|
350
322
|
data_table._instance._client.table_data_client, "mutate_rows"
|
|
351
323
|
) as mutate_mock:
|
|
@@ -358,16 +330,13 @@ def test_table_mutate_rows_retries_timeout(data_table, rows_to_delete):
|
|
|
358
330
|
|
|
359
331
|
row = data_table.direct_row(ROW_KEY)
|
|
360
332
|
rows_to_delete.append(row)
|
|
361
|
-
row.set_cell(COLUMN_FAMILY_ID1, COL_NAME1, CELL_VAL1)
|
|
333
|
+
row.set_cell(COLUMN_FAMILY_ID1, COL_NAME1, CELL_VAL1, timestamp=timestamp)
|
|
362
334
|
|
|
363
335
|
row_2 = data_table.direct_row(ROW_KEY_ALT)
|
|
364
336
|
rows_to_delete.append(row_2)
|
|
365
|
-
row_2.set_cell(COLUMN_FAMILY_ID1, COL_NAME1, CELL_VAL1)
|
|
337
|
+
row_2.set_cell(COLUMN_FAMILY_ID1, COL_NAME1, CELL_VAL1, timestamp=timestamp)
|
|
366
338
|
|
|
367
|
-
|
|
368
|
-
default_retry_copy = copy.copy(DEFAULT_RETRY)
|
|
369
|
-
_add_test_error_handler(default_retry_copy)
|
|
370
|
-
statuses = data_table.mutate_rows([row, row_2], retry=default_retry_copy)
|
|
339
|
+
statuses = data_table.mutate_rows([row, row_2])
|
|
371
340
|
assert statuses[0].code == Code.OK
|
|
372
341
|
assert statuses[1].code == Code.OK
|
|
373
342
|
|
|
@@ -381,34 +350,41 @@ def test_table_mutate_rows_retries_timeout(data_table, rows_to_delete):
|
|
|
381
350
|
|
|
382
351
|
row = data_table.direct_row(ROW_KEY)
|
|
383
352
|
rows_to_delete.append(row)
|
|
384
|
-
row.set_cell(COLUMN_FAMILY_ID1, COL_NAME1, CELL_VAL1)
|
|
353
|
+
row.set_cell(COLUMN_FAMILY_ID1, COL_NAME1, CELL_VAL1, timestamp=timestamp)
|
|
385
354
|
|
|
386
355
|
row_2 = data_table.direct_row(ROW_KEY_ALT)
|
|
387
356
|
rows_to_delete.append(row_2)
|
|
388
|
-
row_2.set_cell(COLUMN_FAMILY_ID1, COL_NAME1, CELL_VAL1)
|
|
357
|
+
row_2.set_cell(COLUMN_FAMILY_ID1, COL_NAME1, CELL_VAL1, timestamp=timestamp)
|
|
389
358
|
|
|
390
|
-
|
|
391
|
-
default_retry_copy = copy.copy(DEFAULT_RETRY)
|
|
392
|
-
_add_test_error_handler(default_retry_copy)
|
|
393
|
-
statuses = data_table.mutate_rows([row, row_2], retry=default_retry_copy)
|
|
359
|
+
statuses = data_table.mutate_rows([row, row_2])
|
|
394
360
|
assert statuses[0].code == Code.OK
|
|
395
|
-
assert statuses[1].code == Code.
|
|
361
|
+
assert statuses[1].code == Code.DEADLINE_EXCEEDED
|
|
396
362
|
|
|
397
|
-
#
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
363
|
+
# Retries with deadline 0 should do nothing.
|
|
364
|
+
with mock.patch.object(
|
|
365
|
+
data_table._instance._client.table_data_client, "mutate_rows"
|
|
366
|
+
) as mutate_mock:
|
|
367
|
+
mutate_mock.side_effect = [
|
|
368
|
+
initial_error_response,
|
|
369
|
+
followup_error_response,
|
|
370
|
+
followup_error_response,
|
|
371
|
+
final_success_response,
|
|
372
|
+
]
|
|
401
373
|
|
|
402
|
-
|
|
403
|
-
|
|
374
|
+
row = data_table.direct_row(ROW_KEY)
|
|
375
|
+
rows_to_delete.append(row)
|
|
376
|
+
row.set_cell(COLUMN_FAMILY_ID1, COL_NAME1, CELL_VAL1, timestamp=timestamp)
|
|
404
377
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
378
|
+
row_2 = data_table.direct_row(ROW_KEY_ALT)
|
|
379
|
+
rows_to_delete.append(row_2)
|
|
380
|
+
row_2.set_cell(COLUMN_FAMILY_ID1, COL_NAME1, CELL_VAL1, timestamp=timestamp)
|
|
381
|
+
|
|
382
|
+
do_nothing_retry = DEFAULT_RETRY.with_deadline(0.0)
|
|
383
|
+
|
|
384
|
+
statuses = data_table.mutate_rows([row, row_2], retry=do_nothing_retry)
|
|
385
|
+
assert statuses[0].code == Code.OK
|
|
386
|
+
assert statuses[1].code == Code.INTERNAL
|
|
387
|
+
mutate_mock.assert_called_once()
|
|
412
388
|
|
|
413
389
|
|
|
414
390
|
def _populate_table(
|
|
@@ -496,26 +472,23 @@ def test_table_mutate_rows_integers(data_table, rows_to_delete):
|
|
|
496
472
|
|
|
497
473
|
|
|
498
474
|
def test_table_mutate_rows_input_errors(data_table, rows_to_delete):
|
|
499
|
-
from google.
|
|
500
|
-
|
|
501
|
-
from google.cloud.bigtable.table import _MAX_BULK_MUTATIONS, TooManyMutationsError
|
|
475
|
+
from google.cloud.bigtable.table import _MAX_BULK_MUTATIONS
|
|
502
476
|
|
|
503
477
|
row = data_table.direct_row(ROW_KEY)
|
|
504
478
|
rows_to_delete.append(row)
|
|
505
479
|
|
|
506
|
-
# Mutate row with 0 mutations gives
|
|
507
|
-
|
|
508
|
-
with pytest.raises(InvalidArgument):
|
|
480
|
+
# Mutate row with 0 mutations gives a ValueError from the client library.
|
|
481
|
+
with pytest.raises(ValueError):
|
|
509
482
|
data_table.mutate_rows([row])
|
|
510
483
|
|
|
511
484
|
row.clear()
|
|
512
485
|
|
|
513
|
-
# Mutate row with >100k mutations gives a
|
|
486
|
+
# Mutate row with >100k mutations gives a ValueError from the
|
|
514
487
|
# client library.
|
|
515
488
|
for _ in range(0, _MAX_BULK_MUTATIONS + 1):
|
|
516
489
|
row.set_cell(COLUMN_FAMILY_ID1, COL_NAME1, CELL_VAL1)
|
|
517
490
|
|
|
518
|
-
with pytest.raises(
|
|
491
|
+
with pytest.raises(ValueError):
|
|
519
492
|
data_table.mutate_rows([row])
|
|
520
493
|
|
|
521
494
|
|