2121import pwd
2222import sys
2323import warnings
24- from . import retry_util
2524
25+ from . import retry_util
26+ import google .auth
2627import googleapiclient .discovery
2728import googleapiclient .errors
2829import googleapiclient .http
2930import tenacity
3031
31- import google .auth
32-
3332
3433# this is the Job ID for jobs that are skipped.
3534NO_JOB = 'NO_JOB'
@@ -56,6 +55,9 @@ def __init__(self, fileobj):
5655 def write (self , buf ):
5756 self ._fileobj .write (buf )
5857
58+ def flush (self ):
59+ self ._fileobj .flush ()
60+
5961
6062@contextlib .contextmanager
6163def replace_print (fileobj = sys .stderr ):
@@ -140,23 +142,25 @@ def get_storage_service(credentials):
140142 'ignore' , 'Your application has authenticated using end user credentials' )
141143 if credentials is None :
142144 credentials , _ = google .auth .default ()
145+ # Set cache_discovery to False because we use google-auth
146+ # See https://github.com/googleapis/google-api-python-client/issues/299
143147 return googleapiclient .discovery .build (
144- 'storage' , 'v1' , credentials = credentials )
148+ 'storage' , 'v1' , credentials = credentials , cache_discovery = False )
145149
146150
147151# Exponential backoff retrying downloads of GCS object chunks.
148152# Maximum 23 retries. Wait 1, 2, 4 ... 64, 64, 64... seconds.
149153@tenacity .retry (
150154 stop = tenacity .stop_after_attempt (retry_util .MAX_API_ATTEMPTS ),
151155 retry = retry_util .retry_api_check ,
152- wait = tenacity .wait_exponential (multiplier = 0.5 , max = 64 ),
156+ wait = tenacity .wait_exponential (multiplier = 1 , max = 64 ),
153157 retry_error_callback = retry_util .on_give_up )
154158# For API errors dealing with auth, we want to retry, but not as often
155159# Maximum 4 retries. Wait 1, 2, 4, 8 seconds.
156160@tenacity .retry (
157161 stop = tenacity .stop_after_attempt (retry_util .MAX_AUTH_ATTEMPTS ),
158162 retry = retry_util .retry_auth_check ,
159- wait = tenacity .wait_exponential (multiplier = 0.5 , max = 8 ),
163+ wait = tenacity .wait_exponential (multiplier = 1 , max = 8 ),
160164 retry_error_callback = retry_util .on_give_up )
161165def _downloader_next_chunk (downloader ):
162166 """Downloads the next chunk."""
@@ -214,14 +218,14 @@ def load_file(file_path, credentials=None):
214218@tenacity .retry (
215219 stop = tenacity .stop_after_attempt (retry_util .MAX_API_ATTEMPTS ),
216220 retry = retry_util .retry_api_check ,
217- wait = tenacity .wait_exponential (multiplier = 0.5 , max = 64 ),
221+ wait = tenacity .wait_exponential (multiplier = 1 , max = 64 ),
218222 retry_error_callback = retry_util .on_give_up )
219223# For API errors dealing with auth, we want to retry, but not as often
220224# Maximum 4 retries. Wait 1, 2, 4, 8 seconds.
221225@tenacity .retry (
222226 stop = tenacity .stop_after_attempt (retry_util .MAX_AUTH_ATTEMPTS ),
223227 retry = retry_util .retry_auth_check ,
224- wait = tenacity .wait_exponential (multiplier = 0.5 , max = 8 ),
228+ wait = tenacity .wait_exponential (multiplier = 1 , max = 8 ),
225229 retry_error_callback = retry_util .on_give_up )
226230def _file_exists_in_gcs (gcs_file_path , credentials = None , storage_service = None ):
227231 """Check whether the file exists, in GCS.
@@ -252,14 +256,14 @@ def _file_exists_in_gcs(gcs_file_path, credentials=None, storage_service=None):
252256@tenacity .retry (
253257 stop = tenacity .stop_after_attempt (retry_util .MAX_API_ATTEMPTS ),
254258 retry = retry_util .retry_api_check ,
255- wait = tenacity .wait_exponential (multiplier = 0.5 , max = 64 ),
259+ wait = tenacity .wait_exponential (multiplier = 1 , max = 64 ),
256260 retry_error_callback = retry_util .on_give_up )
257261# For API errors dealing with auth, we want to retry, but not as often
258262# Maximum 4 retries. Wait 1, 2, 4, 8 seconds.
259263@tenacity .retry (
260264 stop = tenacity .stop_after_attempt (retry_util .MAX_AUTH_ATTEMPTS ),
261265 retry = retry_util .retry_auth_check ,
262- wait = tenacity .wait_exponential (multiplier = 0.5 , max = 8 ),
266+ wait = tenacity .wait_exponential (multiplier = 1 , max = 8 ),
263267 retry_error_callback = retry_util .on_give_up )
264268def _prefix_exists_in_gcs (gcs_prefix , credentials = None , storage_service = None ):
265269 """Check whether there is a GCS object whose name starts with the prefix.
@@ -302,14 +306,14 @@ def folder_exists(folder_path, credentials=None, storage_service=None):
302306@tenacity .retry (
303307 stop = tenacity .stop_after_attempt (retry_util .MAX_API_ATTEMPTS ),
304308 retry = retry_util .retry_api_check ,
305- wait = tenacity .wait_exponential (multiplier = 0.5 , max = 64 ),
309+ wait = tenacity .wait_exponential (multiplier = 1 , max = 64 ),
306310 retry_error_callback = retry_util .on_give_up )
307311# For API errors dealing with auth, we want to retry, but not as often
308312# Maximum 4 retries. Wait 1, 2, 4, 8 seconds.
309313@tenacity .retry (
310314 stop = tenacity .stop_after_attempt (retry_util .MAX_AUTH_ATTEMPTS ),
311315 retry = retry_util .retry_auth_check ,
312- wait = tenacity .wait_exponential (multiplier = 0.5 , max = 8 ),
316+ wait = tenacity .wait_exponential (multiplier = 1 , max = 8 ),
313317 retry_error_callback = retry_util .on_give_up )
314318def simple_pattern_exists_in_gcs (file_pattern ,
315319 credentials = None ,
0 commit comments