[
https://issues.apache.org/jira/browse/FLINK-34007?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17808872#comment-17808872
]
Matthias Pohl commented on FLINK-34007:
---------------------------------------
Increasing the thread size was necessary because we executed the run command in
[KubernetesLeaderElector#run|https://github.com/apache/flink/blob/c5808b04fdce9ca0b705b6cc7a64666ab6426875/flink-kubernetes/src/main/java/org/apache/flink/kubernetes/kubeclient/resources/KubernetesLeaderElector.java#L103]
in the same thread pool that is used in the fabric8io LeaderElector for
running the CompetableFutures in the loop:
The {{LeaderElector#run}} call waits for the CompletableFuture returned by
{{LeaderElector#acquire}} to complete (see
[LeaderElector:70|https://github.com/fabric8io/kubernetes-client/blob/0f6c696509935a6a86fdb4620caea023d8e680f1/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/extended/leaderelection/LeaderElector.java#L70]).
{{LeaderElector#acquire}} will trigger an asynchronous call on the
{{executorService}} which wouldn't pick up the task because the single thread
is waiting for the acquire call to complete. This deadlock situation is
reproduced by Flink's {{{}KubernetesLeaderElectionITCase{}}}. I would imagine
that this is the timeout, [~gyfora] was experiencing when upgrading to v6.6.2.
The 3 threads that were introduced by FLINK-31997 shouldn't have caused any
issues because the LeaderElector only writes to the ConfigMap in
[LeaderElector#tryAcquireOrRenew|https://github.com/fabric8io/kubernetes-client/blob/0f6c696509935a6a86fdb4620caea023d8e680f1/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/extended/leaderelection/LeaderElector.java#L210]
and
[LeaderElector#release|https://github.com/fabric8io/kubernetes-client/blob/0f6c696509935a6a86fdb4620caea023d8e680f1/kubernetes-client-api/src/main/java/io/fabric8/kubernetes/client/extended/leaderelection/LeaderElector.java#L147].
Both methods are synchronized. Hence, they shouldn't cause a race condition in
any way as far as I can see.
I created a [draft PR with a fix|https://github.com/apache/flink/pull/24132]
that recreates the fabric8io {{LeaderElector}} instead of reusing it. The fix
also covers reverts the thread pool size from 3 to 1 with
{{KubernetesLeaderElectionITCase}} passing again. I still have to think of a
way to test Flink's KubernetesLeaderElector on the issue that caused the
failure of this Jira. The only way I could think of is doing something similar
to what's done in the [fabric8io
codebase|https://github.com/fabric8io/kubernetes-client/blob/0f6c696509935a6a86fdb4620caea023d8e680f1/kubernetes-client-api/src/test/java/io/fabric8/kubernetes/client/extended/leaderelection/LeaderElectorTest.java#L63]
with Mockito. Any other ideas are appreciated. I would like to avoid Mockito.
> Flink Job stuck in suspend state after losing leadership in HA Mode
> -------------------------------------------------------------------
>
> Key: FLINK-34007
> URL: https://issues.apache.org/jira/browse/FLINK-34007
> Project: Flink
> Issue Type: Bug
> Components: Runtime / Coordination
> Affects Versions: 1.19.0, 1.18.1, 1.18.2
> Reporter: Zhenqiu Huang
> Priority: Blocker
> Labels: pull-request-available
> Attachments: Debug.log, LeaderElector-Debug.json, job-manager.log
>
>
> The observation is that Job manager goes to suspend state with a failed
> container not able to register itself to resource manager after timeout.
> JM Log, see attached
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)