Skip to content

Commit ab25b8a

Browse files
authored
Merge pull request #587 from USACE/timeout-check
Update dss7.py
2 parents e2e9b3e + fcfc273 commit ab25b8a

File tree

1 file changed

+33
-10
lines changed
  • async_packager/src/cumulus_packager/writers

1 file changed

+33
-10
lines changed

async_packager/src/cumulus_packager/writers/dss7.py

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)