@@ -94,16 +94,24 @@ def create_bq_connection(
94
94
# https://cloud.google.com/bigquery/docs/reference/standard-sql/remote-functions#grant_permission_on_function
95
95
self ._ensure_iam_binding (project_id , service_account_id , iam_role )
96
96
97
- # Introduce retries to accommodate transient errors like etag mismatch,
98
- # which can be caused by concurrent operation on the same resource, and
99
- # manifests with message like:
100
- # google.api_core.exceptions.Aborted: 409 There were concurrent policy
101
- # changes. Please retry the whole read-modify-write with exponential
102
- # backoff. The request's ETag '\007\006\003,\264\304\337\272' did not match
103
- # the current policy's ETag '\007\006\003,\3750&\363'.
97
+ # Introduce retries to accommodate transient errors like:
98
+ # (1) Etag mismatch,
99
+ # which can be caused by concurrent operation on the same resource, and
100
+ # manifests with message like:
101
+ # google.api_core.exceptions.Aborted: 409 There were concurrent policy
102
+ # changes. Please retry the whole read-modify-write with exponential
103
+ # backoff. The request's ETag '\007\006\003,\264\304\337\272' did not
104
+ # match the current policy's ETag '\007\006\003,\3750&\363'.
105
+ # (2) Connection creation,
106
+ # for which sometimes it takes a bit for its service account to reflect
107
+ # across APIs (e.g. b/397662004, b/386838767), before which, an attempt
108
+ # to set an IAM policy for the service account may throw an error like:
109
+ # google.api_core.exceptions.InvalidArgument: 400 Service account
110
+ # bqcx-*@gcp-sa-bigquery-condel.iam.gserviceaccount.com does not exist.
104
111
@google .api_core .retry .Retry (
105
112
predicate = google .api_core .retry .if_exception_type (
106
- google .api_core .exceptions .Aborted
113
+ google .api_core .exceptions .Aborted ,
114
+ google .api_core .exceptions .InvalidArgument ,
107
115
),
108
116
initial = 10 ,
109
117
maximum = 20 ,
0 commit comments