aglinxinyuan opened a new issue, #6920:
URL: https://github.com/apache/texera/issues/6920

   ### What happened?
   
   The 150-attempt region-termination retry budget only bounds **failures** — 
it is bypassed entirely by **non-delivery**, so a single failed `gracefulStop` 
pass can wedge the whole workflow silently, with the give-up ERROR never 
firing. This is exactly the silent-hang class that the bounded retry (#5737) 
was meant to eliminate.
   
   Sequence:
   
   ```
   attempt K: terminateWorkers
     ├─ endWorker OK for all workers
     ├─ for each worker: removeActorRef (:198), removeControlChannel x2 
(:201-202)   <- state already torn down
     └─ gracefulStop fails for ONE worker (e.g. a slow Python PVM > 5 s)        
     <- attempt K fails
   
   attempt K+1: re-sends endWorker to ALL workers 
(RegionExecutionManager.scala:177-184)
     ├─ removed worker, ref gone   -> message parks FOREVER in messageStash 
(PekkoActorRefMappingService.scala:69-73)
     └─ ref still resolvable       -> coordinator seq was reset to 0 by 
removeControlChannel
                                      (NetworkOutputGateway.scala:97-101) while 
the worker's channel
                                      `current` is still > 0 -> classified 
duplicate and silently
                                      dropped (AmberFIFOChannel.scala:60-61; 
debug-only log at :46-49)
   
   either way: Future.collect(endWorkerRequests) (:186-187) never resolves
     -> rescue never runs -> retry budget never consumed -> give-up ERROR 
(:237) never fires
     -> terminationFutureRef (CAS-set once, :157-171) wedges 
advanceRegionExecutions
        (WorkflowExecutionManager.scala:108-113) -> no later region ever starts
   ```
   
   Aggravating details:
   
   - There is **no timeout anywhere** on the path: not on the `endWorker` 
collect, not on AsyncRPCClient promises (a repo grep for 
`.within(|raiseWithin|TimeoutException` in amber main sources hits only 
unrelated files).
   - `actorRefService.getActorRef(workerId)` at 
`RegionExecutionManager.scala:196` is a bare map apply 
(`PekkoActorRefMappingService.scala:50-52`) and throws `NoSuchElementException` 
for a worker whose ref was removed by a previous attempt.
   - The 30 s resend timer cannot rescue the seq-reset case: it re-sends the 
same (now duplicate) sequence number forever. Its suppression guard is 
separately broken (filed separately).
   
   A per-attempt `.within(...)` timeout on the `endWorker`/`gracefulStop` 
collects (using the existing `killRetryTimer`) would make the budget honest; 
the channel/ref teardown at :198-202 probably needs to move after the *whole 
region's* stop pass succeeds, not run per-attempt.
   
   ### How to reproduce?
   
   Make one worker's `gracefulStop` exceed the 5 s bound during region 
termination (e.g. a Python worker whose PVM is slow to exit) on a multi-worker 
region. Attempt 2's `endWorker`s either stash forever or are dropped as 
duplicates; the workflow hangs with no ERROR log.
   
   ### Version/Branch
   
   main (observed at 429be110a7; discovered during the investigation for #6916).
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to