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

László Bodor reassigned TEZ-4732:
---------------------------------

    Assignee: Ryu Kobayashi

> MergeManager: deadlock when usedMemory exceeds limit but commitMemory is 
> below merge threshold
> ----------------------------------------------------------------------------------------------
>
>                 Key: TEZ-4732
>                 URL: https://issues.apache.org/jira/browse/TEZ-4732
>             Project: Apache Tez
>          Issue Type: Bug
>            Reporter: Ryu Kobayashi
>            Assignee: Ryu Kobayashi
>            Priority: Major
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> Problem
> In the ordered grouped shuffle, the shuffle scheduler can hang indefinitely 
> due to a deadlock in MergeManager. Once the deadlock occurs, the task makes 
> no progress and eventually times out.
> Root Cause
> MergeManager.waitForShuffleToMergeMemory() waits with no timeout until 
> usedMemory <= memoryLimit. The only thread that schedules fetchers 
> (ShuffleSchedulerCallable) calls this method before scheduling the next 
> fetch. This creates a circular deadlock under the following condition:
> - usedMemory > memoryLimit: memory is full, no new data can be accepted
> - commitMemory < mergeThreshold: not enough committed data to trigger an 
> in-memory merge
> In this state:
>  # The fetcher scheduler is blocked waiting for memory to be freed
>  # Memory is freed only after a merge completes
>  # A merge is triggered only when commitMemory >= mergeThreshold
>  # commitMemory increases only when fetchers commit new data
>  # Fetchers are not scheduled because the scheduler is blocked
> There is no code path to break out of this cycle.
> Conditions That Make This Likely
> The deadlock window is narrow under normal memory configurations, but becomes 
> much more likely when per-input memory is small. This happens when a Reducer 
> reads from a large number of source vertices (e.g., via many UNION inputs), 
> causing Tez to allocate an independent MergeManager per source with a 
> proportionally small memoryLimit. If maxSingleShuffleLimit exceeds the gap 
> between mergeThreshold and memoryLimit, a single fetch response can push 
> usedMemory over the limit before commitMemory reaches the threshold, 
> immediately entering the deadlock state.



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

Reply via email to