@@ -213,15 +213,18 @@ def _run_parallel( # noqa: C901 — pool-shape branching + multi-failure-mode d
213213 )
214214
215215 def _drain (active_pool : ProcessPoolExecutor ) -> None :
216+ from concurrent .futures import CancelledError
216217 from concurrent .futures .process import BrokenProcessPool
217218
218219 futures : dict = {}
219220 submit_failed : list [BenchmarkInstance ] = []
221+ pool_broken = False
220222 for inst in pending :
221223 try :
222224 futures [active_pool .submit (eval_fn , inst , params )] = inst
223225 except BrokenProcessPool :
224226 submit_failed .extend ([inst , * pending [pending .index (inst ) + 1 :]])
227+ pool_broken = True
225228 break
226229 outer_deadline = time .monotonic () + timeout_per_instance * max (1 , (len (pending ) + workers - 1 ) // workers )
227230 completed : set [str ] = set ()
@@ -230,10 +233,11 @@ def _drain(active_pool: ProcessPoolExecutor) -> None:
230233 inst = futures [future ]
231234 try :
232235 r = future .result (timeout = 0 )
233- except FuturesTimeoutError :
236+ except ( FuturesTimeoutError , CancelledError ) :
234237 r = _failure_result (inst , params , "timeout" , f"after { timeout_per_instance } s" )
235238 except BrokenProcessPool :
236239 r = _failure_result (inst , params , "error" , "BrokenProcessPool: worker died" )
240+ pool_broken = True
237241 except Exception as e :
238242 r = _failure_result (inst , params , "error" , f"{ type (e ).__name__ } : { e } " )
239243 completed .add (inst .instance_id )
@@ -243,12 +247,13 @@ def _drain(active_pool: ProcessPoolExecutor) -> None:
243247 if inst .instance_id not in completed :
244248 record (_failure_result (inst , params , "timeout" , "exceeded global deadline" ))
245249 except BrokenProcessPool :
250+ pool_broken = True
246251 for inst in futures .values ():
247252 if inst .instance_id not in completed :
248253 record (_failure_result (inst , params , "error" , "BrokenProcessPool: worker died" ))
249254 for inst in submit_failed :
250255 record (_failure_result (inst , params , "error" , "BrokenProcessPool: submit failed" ))
251- if submit_failed or any ( inst . instance_id not in completed for inst in futures . values ()) :
256+ if pool_broken :
252257 raise BrokenProcessPool ("pool degraded mid-cell" )
253258
254259 if pool is not None :
0 commit comments