[ 
https://issues.apache.org/jira/browse/FLINK-41271?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Dian Fu reassigned FLINK-41271:
-------------------------------

    Assignee: Biao Geng

> PyFlink tasks remain RUNNING after a Beam data RPC failure
> ----------------------------------------------------------
>
>                 Key: FLINK-41271
>                 URL: https://issues.apache.org/jira/browse/FLINK-41271
>             Project: Flink
>          Issue Type: Bug
>          Components: API / Python
>         Environment: Flink 2.5-SNAPSHOT (local baseline 
> {{{}8cab5daa02e5{}}}), Beam 2.75.0, Java 17.0.16, Python 3.11.13. Standalone 
> cluster with one slot, parallelism 1 and Python process mode.
>            Reporter: Biao Geng
>            Assignee: Biao Geng
>            Priority: Major
>              Labels: pull-request-available
>         Attachments: pyflink-data-rpc-reproducer.zip
>
>
> A PyFlink process-mode task can remain RUNNING after its Beam data RPC has 
> terminated. The bundle-flush thread continues waiting for output completion, 
> preventing the task from reporting a failure, so a configured restart 
> strategy cannot take effect.
> This was reproduced with a real direct-memory allocation failure in the JVM's 
> shaded Netty receive path. The Python worker remains alive; the test does not 
> kill it or manually throw an OutOfMemoryError.
>  
> *Reproduction*
> Commands, fixture and logs are attached.
>  # Run Java source → Python map → Java sink. Confirm that a small warmup 
> response reaches the sink.
>  # With {{{}-XX:MaxDirectMemorySize=128m{}}}, retain direct buffers in the 
> TaskManager until approximately 512 KiB remains.
>  # Return a 16 MiB string from Python. This triggers a real direct OOM in the 
> Netty receive path and terminates the data RPC.
>  # For shared-worker recovery, add an independent keeper branch sharing the 
> worker. A test-only watchdog fails the target once while the keeper stays 
> running; this is necessary to test recovery independently of the missing 
> automatic failure detection.
> *Actual behavior*
>  * The task remains RUNNING for the 67.8-second observation window. Both 
> thread dumps show {{ActiveBundle.close}} blocked in 
> {{{}BeamFnDataInboundObserver.awaitCompletion{}}}.
>  * With the keeper, target retries reuse the same closed data channel and 
> fail with {{call already cancelled}} / {{{}Channel closed prematurely{}}}. 
> The keeper stays at attempt 0. Direct memory has fallen to 77.8 MiB, with no 
> further pressure injection.
>  * Without the keeper, the forced-failure control creates a new worker and 
> recovers.
> *Expected behavior*
> A terminal data RPC failure should fail all affected Python tasks and release 
> their blocked waits. With retries enabled, they should recover using a 
> functioning worker and data channel.
> *Fix and validation*
> The Flink-only fix observes RPC termination through Beam’s existing 
> server-factory extension point and notifies all affected runners.
>  * No-pressure control: complete 16 MiB result and FINISHED.
>  * OOM with restart disabled: automatic FAILED and bundle-flush thread exits.
>  * Recovery without a keeper succeeds. Shared-worker recovery succeeds in 3/3 
> runs: both tasks restart at attempt 1 with a new worker/channel and FINISH. 
> All fix-validation runs disable the watchdog.
>  * 21 targeted tests, Spotless and Checkstyle pass.
> The fix releases the failed worker by restarting all affected tasks, 
> including the keeper.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to