diff --git a/google/cloud/bigtable/row_data.py b/google/cloud/bigtable/row_data.py index 0e07ff268..0a0bd96e4 100644 --- a/google/cloud/bigtable/row_data.py +++ b/google/cloud/bigtable/row_data.py @@ -18,6 +18,7 @@ import copy import time +import google.api_core.exceptions import six import grpc @@ -507,7 +508,15 @@ def _read_next(self): try: return six.next(self.response_iterator) except grpc.RpcError as grpc_error: - raise exceptions.from_grpc_error(grpc_error) + # TODO: this needs to be moved to a more general location (ie interceptor) + e = exceptions.from_grpc_error(grpc_error) + # Sometimes GOAWAYs are surfaced as INTERNAL errors, which makes + # them unretriable. This patches that behavior + if e.grpc_status_code == grpc.StatusCode.INTERNAL and ( + "rst_stream" in e.message.lower() or "rst stream" in e.message.lower() + ): + raise google.api_core.exceptions.ServiceUnavailable(e.message) + raise e def _read_next_response(self): """Helper for :meth:`__iter__`."""