@@ -102,8 +102,7 @@ def __call__(self, func):
102102 def func_with_timeout (* args , ** kwargs ):
103103 """Wrapped function that adds timeout."""
104104
105- remaining_timeout = self ._timeout
106- if remaining_timeout is not None :
105+ if self ._timeout is not None :
107106 # All calculations are in seconds
108107 now_timestamp = self ._clock ().timestamp ()
109108
@@ -114,8 +113,20 @@ def func_with_timeout(*args, **kwargs):
114113 now_timestamp = first_attempt_timestamp
115114
116115 time_since_first_attempt = now_timestamp - first_attempt_timestamp
117- # Avoid setting negative timeout
118- kwargs ["timeout" ] = max (0 , self ._timeout - time_since_first_attempt )
116+ remaining_timeout = self ._timeout - time_since_first_attempt
117+
118+ # Although the `deadline` parameter in `google.api_core.retry.Retry`
119+ # is deprecated, and should be treated the same as the `timeout`,
120+ # it is still possible for `deadline` argument in google.api_core.retry.Retry
121+ # to be larger than the `timeout`.
122+ # Avoid setting negative timeout or timeout less than 5 seconds when the `timeout`
123+ # has expired.
124+ # See https://github.com/googleapis/python-api-core/issues/654
125+ # Revert back to the original timeout when this happens
126+ if remaining_timeout < 5 :
127+ remaining_timeout = self ._timeout
128+
129+ kwargs ["timeout" ] = remaining_timeout
119130
120131 return func (* args , ** kwargs )
121132
0 commit comments