@@ -418,8 +418,17 @@ def producer():
418418 }
419419
420420 for future in as_completed (future_to_idx ):
421- result = future .result ()
422- result_queue .put (result )
421+ try :
422+ result = future .result (timeout = 300 ) # 5 minute timeout per file
423+ result_queue .put (result )
424+ except Exception as e :
425+ idx = future_to_idx [future ]
426+ logger .error (f"Worker timeout or error for file { idx } : { e } " )
427+ result_queue .put ({
428+ 'success' : False ,
429+ 'index' : idx ,
430+ 'error' : f'Worker timeout or exception: { str (e )} '
431+ })
423432
424433 # Signal completion
425434 result_queue .put (None )
@@ -447,16 +456,30 @@ def producer():
447456 compressed_size = result ['compressed_size' ]
448457 tif_key = result ['tif_key' ]
449458
450- # Write precompressed data to DSS (GriddedData already created in worker)
459+ # Write precompressed data to DSS with timeout protection
451460 t = Timer (name = "accumuluated" , logger = None )
452461 t .start ()
453- dss_result = dss .writePrecompressedGrid (gd , compressed_data , compressed_size )
454- elapsed_time = t .stop ()
455-
456- if dss_result != 0 :
457- logger .warning (f'HEC-DSS-PY write record failed for "{ tif_key } ": { dss_result } ' )
458- elif logger .isEnabledFor (logging .DEBUG ):
459- logger .debug (f'DSS writePrecompressedGrid processed "{ tif_key } " in { elapsed_time :.4f} s' )
462+
463+ # Wrap DSS write in thread with timeout (DSS operations can hang)
464+ with ThreadPoolExecutor (max_workers = 1 ) as write_executor :
465+ write_future = write_executor .submit (
466+ dss .writePrecompressedGrid , gd , compressed_data , compressed_size
467+ )
468+ try :
469+ dss_result = write_future .result (timeout = 300 ) # 5 minute timeout for DSS write
470+ elapsed_time = t .stop ()
471+
472+ if dss_result != 0 :
473+ logger .warning (f'HEC-DSS-PY write record failed for "{ tif_key } ": { dss_result } ' )
474+ elif logger .isEnabledFor (logging .DEBUG ):
475+ logger .debug (f'DSS writePrecompressedGrid processed "{ tif_key } " in { elapsed_time :.4f} s' )
476+ except Exception as write_error :
477+ elapsed_time = t .stop ()
478+ logger .error (f'DSS write timeout or error for "{ tif_key } " after { elapsed_time :.2f} s: { write_error } ' )
479+ # Continue processing remaining files
480+ gd = None
481+ compressed_data = None
482+ continue
460483
461484 processed_count += 1
462485
0 commit comments