@@ -479,6 +479,12 @@ def _init_filesystem(url, **kwargs):
479479
480480 kwargs .setdefault ("token" , credentials )
481481
482+ # Set retry and timeout defaults for GCS to handle transient errors
483+ # on unreliable networks (e.g., field stations in endemic regions).
484+ # gcsfs supports retry (number of retries) and timeout (seconds).
485+ kwargs .setdefault ("retry" , 3 )
486+ kwargs .setdefault ("timeout" , 60 )
487+
482488 # Ensure options are passed through to gcsfs, even if URL is chained.
483489 if url .startswith ("gs://" ) or url .startswith ("gcs://" ):
484490 storage_options = kwargs
@@ -501,6 +507,13 @@ def _init_filesystem(url, **kwargs):
501507 kwargs .setdefault ("endpoint_url" , "https://cog.sanger.ac.uk" )
502508 kwargs .setdefault ("config_kwargs" , config )
503509
510+ # Set retry and timeout defaults for S3 to handle transient errors.
511+ # s3fs supports retries (max retry attempts) and
512+ # config_kwargs for connect/read timeouts.
513+ kwargs .setdefault ("retries" , 3 )
514+ config .setdefault ("connect_timeout" , 60 )
515+ config .setdefault ("read_timeout" , 60 )
516+
504517 if url .startswith ("s3://" ):
505518 storage_options = kwargs
506519 else :
@@ -509,6 +522,9 @@ def _init_filesystem(url, **kwargs):
509522
510523 else :
511524 # Some other kind of URL, pass through kwargs as-is.
525+ # Set a default timeout for remote HTTP/HTTPS filesystems.
526+ if url .startswith ("http://" ) or url .startswith ("https://" ):
527+ kwargs .setdefault ("timeout" , 60 )
512528 storage_options = kwargs
513529
514530 if simplecache_options is not None :
0 commit comments