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

Wilfred Spiegelenburg reassigned YUNIKORN-3376:
-----------------------------------------------

    Assignee: Dale Richardson

>  Data race on Task.pod: checkPodMetadataBeforeScheduling reads without the 
> task lock
> ------------------------------------------------------------------------------------
>
>                 Key: YUNIKORN-3376
>                 URL: https://issues.apache.org/jira/browse/YUNIKORN-3376
>             Project: Apache YuniKorn
>          Issue Type: Bug
>          Components: shim - kubernetes
>            Reporter: Dale Richardson
>            Assignee: Dale Richardson
>            Priority: Minor
>              Labels: pull-request-available
>
> {{Task.checkPodMetadataBeforeScheduling}} ({{pkg/cache/task.go}} ~523) reads 
> {{task.pod}} several times without holding the task lock. It runs on the shim 
> scheduling goroutine ({{Application.Schedule}} -> {{scheduleTasks}}, 
> {{application.go}} ~403), concurrently with {{SetTaskPod}} ({{task.go}} 
> ~676), which writes the same field under {{task.lock}} from the informer 
> handler ({{Context.updateYuniKornPod}}). The neighbouring {{checkPodPVCs}} 
> takes {{RLock}} for exactly the same field, so this is a missed lock, not a 
> lock-free design choice.
> Confirmed by the race detector under load (read: {{scheduleTasks}} via the 
> {{wait.BackoffUntil}} scheduling loop; previous write: {{SetTaskPod}} via 
> {{Context.UpdatePod}} -- both production paths). An audit of every other 
> {{task.pod}} access in the file found them all correctly protected (directly 
> or inside FSM callbacks running under {{task.handle}}'s write lock), so this 
> is the only gap.
> Impact is limited: the function is diagnostic-only (a warning log and a k8s 
> event), both racing values are complete immutable informer objects, and an 
> aligned pointer load does not tear on supported platforms. Filed because it 
> is formal Go-memory-model UB, it can flake any {{-race}} CI run, and the fix 
> is one line: snapshot {{pod := task.GetTaskPod()}} at the top of the function 
> and use it (including in {{logIgnoredPodMetadata}}).



--
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