11import logging
22import os
33from copy import deepcopy
4+ from functools import wraps
45from io import BytesIO
56from pathlib import PurePosixPath
67from typing import Any , Callable
1920)
2021
2122from ...utils import LazyDataset , LazyFrame , LazyPartition
22- from ...utils .progress import get_node_name , process , process_in_parallel
23+ from ...utils .progress import get_node_name , process , process_in_parallel , DEBUG
2324
2425logger = logging .getLogger (__name__ )
2526
2627
28+ def _wrap_retry (f ):
29+ if DEBUG :
30+ # Skip wrapping if DEBUG is on so exceptions break correctly
31+ return f
32+
33+ @wraps (f )
34+ def _wrap (* args , ** kwargs ):
35+ ex = None
36+ for i in range (3 ):
37+ try :
38+ return f (* args , ** kwargs )
39+ except Exception as e :
40+ import time
41+
42+ # Prevents pipeline crashing on unreliable network shares
43+ logger .warn (
44+ f"Failed fs function '{ f .__name__ } (path={ kwargs .get ('path' , str (args [0 ]) if args else 'None' )} )' (attempt { i + 1 } /3). Waiting 1 second and retrying..."
45+ )
46+ time .sleep (1 )
47+ ex = e
48+ if ex :
49+ raise ex
50+
51+ return _wrap
52+
53+
54+ @_wrap_retry
2755def _save_worker (
2856 pid : str | None ,
2957 path : str ,
@@ -132,6 +160,7 @@ def _save_worker(
132160 fs_file .write (bytes_buffer .getvalue ())
133161
134162
163+ @_wrap_retry
135164def _load_worker (
136165 path : str ,
137166 protocol : str ,
@@ -155,6 +184,7 @@ def _load_worker(
155184 return pd .read_parquet (load_path , storage_options = storage_options , ** load_args )
156185
157186
187+ @_wrap_retry
158188def _load_merged_worker (
159189 load_path : str , filesystem , load_args , columns : list [str ] | None = None
160190):
@@ -191,6 +221,7 @@ def _load_merged_worker(
191221 return out
192222
193223
224+ @_wrap_retry
194225def _load_shape_worker (load_path : str , filesystem , * _ , ** __ ):
195226 # TODO: verify this returns correct numbers (esp. columns)
196227 data = pq .ParquetDataset (load_path , filesystem = filesystem , use_legacy_dataset = False )
0 commit comments