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

ASF GitHub Bot updated YUNIKORN-3405:
-------------------------------------
    Labels: pull-request-available  (was: )

> Dispatcher Start and Stop operations have race conditions
> ---------------------------------------------------------
>
>                 Key: YUNIKORN-3405
>                 URL: https://issues.apache.org/jira/browse/YUNIKORN-3405
>             Project: Apache YuniKorn
>          Issue Type: Bug
>          Components: shim - kubernetes
>            Reporter: Andy Huang
>            Assignee: Andy Huang
>            Priority: Major
>              Labels: pull-request-available
>
> The Kubernetes shim dispatcher lifecycle implementation uses separate checks 
> and state updates that are not atomic across Start() and Stop().
> Dispatcher.Start() checks isRunning(), replaces stopChan, updates a 
> WaitGroup, starts a goroutine, and only then marks the dispatcher as running. 
> Concurrent Start() calls can both observe running=false and proceed. This can 
> result in:
> * multiple dispatcher goroutines being started;
> * stopChan being replaced while another goroutine still references it;
> * a dispatcher goroutine becoming unreachable by Stop();
> * inconsistent WaitGroup accounting;
> * leaked goroutines.
> Dispatcher.Stop() first checks whether stopChan is closed and later closes it 
> as a separate operation. Concurrent Stop() calls can both observe an open 
> channel and attempt to close it, causing a close-of-closed-channel panic.
> Start() and Stop() may also race while stopChan and the running state are 
> updated independently.
> There is an additional timeout recovery problem. Stop() waits up to five 
> seconds for the dispatcher loop to terminate. If that timeout is reached, 
> running remains true. A subsequent Start() then no-ops because it sees 
> running=true. When the stale dispatcher loop eventually exits and clears 
> running, no event-processing loop is started for the remainder of the 
> process. This primarily affects in-process test reuse, but represents an 
> inconsistent lifecycle state.
> The dispatcher lifecycle should be made thread-safe, idempotent, and 
> explicit. State transitions involving running, stopChan, and the shutdown 
> WaitGroup must be coordinated as one operation.
> Expected behavior:
> * Only one dispatcher event-processing goroutine can run.
> * Concurrent Start() calls do not create duplicate or unreachable goroutines.
> * Stop() is safe and idempotent.
> * Concurrent Stop() calls do not panic.
> * Start() and Stop() cannot leave stopChan, the running state, or WaitGroup 
> accounting inconsistent.
> * A timed-out Stop() cannot prevent a later Start() from creating an active 
> event-processing loop.
> * Stop() waits for the active dispatcher goroutine to terminate, subject to 
> the existing shutdown timeout.
> This was identified while reviewing KubernetesShim shutdown fixes:
> * https://issues.apache.org/jira/browse/YUNIKORN-3367
> * https://github.com/apache/yunikorn-k8shim/pull/1074



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to