Repository navigation
Conversation
A hard split does not shrink the partition file, so the file keeps failing the threshold check in checkDiskFullAndSplit until a new epoch propagates to every pusher. Until then each concurrent push to that file logged the whole multi-line "CheckDiskFullAndSplit hardSplit" INFO again. On a cluster where celeborn.worker.shuffle.partitionSplit.max equalled celeborn.client.shuffle.partitionSplit.threshold, which makes the SOFT branch unreachable and every split hard, this produced 20.2M log events in 7 minutes from a handful of wedged partitions. Latch the log on the PartitionDataWriter so the cause is recorded once per split file. The latch lives and dies with the writer, so it needs no cleanup hook. WorkerSource.WRITE_DATA_HARD_SPLIT_COUNT already carries the rate. Also fix the sibling warning in handlePushMergedData, which fired once per hard-split partition per merged push and attributed every hard split to a full disk. checkDiskFullAndSplit returns HARD_SPLIT for three reasons and only one of them is disk pressure, so the message misdirected triage. It carries nothing the INFO does not, and the counter on the next line already covers rate, so it moves to debug. Behavior is unchanged, this is log noise only. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Push data retries are resubmitted to pushDataRetryPool immediately. The
dueTime computed at each site is not a retry delay: it is the deadline for
the revive busy-wait inside the retry task, so the effective retry cadence
is bounded only by celeborn.client.push.revive.interval, 100ms by default.
Every map task blocked on the same partition therefore retries in lockstep,
and each retry calls dataClientFactory.createClient, so a stuck partition
turns into a synchronised burst of connection setup against one worker.
This is load-bearing rather than cosmetic on the HARD_SPLIT path, because
the two HARD_SPLIT sites pass remainReviveTimes through without decrementing
it. A partition wedged in HARD_SPLIT never exhausts its revive budget, so
the only brake in the system never engages and the retry loop is unbounded.
Schedule retries with an exponentially growing delay, capped and jittered.
pushDataRetryPool becomes a ScheduledExecutorService so the delay costs no
pool thread; sleeping in the task would be worse than the problem, since the
pool defaults to 8 threads that already block on the revive wait.
Backoff applies to all five retry sites, not just HARD_SPLIT. The failure
sites are reached when a worker is already sick, and retrying an unreachable
worker with no delay is what turns one bad worker into a connection storm.
Three new configs, all client side:
celeborn.client.push.retry.backoff.initial 500ms, 0 disables
celeborn.client.push.retry.backoff.max 10s, well under the 120s
push data timeout
celeborn.client.push.retry.backoff.jitter 0.5, equal jitter so the delay
never collapses to zero
Not included, deliberately: making the HARD_SPLIT sites decrement
remainReviveTimes would bound those retries and start failing tasks. That
is a behaviour change and deserves its own ticket. The merged-data
HARD_SPLIT site also has no per-batch attempt counter to grow from, so it
takes the initial delay with jitter; threading a counter through
doPushMergedData is left as follow-up.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Looks good from the code review; no P0/P1 issues found. I checked single and merged push retries, revive deadlines and retry budgets, and the atomic per-writer log guard, which leaves split decisions and counters unchanged. Existing retry/split tests do not cover the new backoff timing or log latch yet, and CI currently shows only the two passing label checks. |
Addressed the review comment by adding necessary tests. |
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Thanks for adding the tests. Looks good from the code review; no P0/P1 issues found. I checked the shared backoff helper across single and merged retries, including revive deadlines and retry budgets. The new tests cover exponential growth, the cap, jitter, disabled backoff, large retry counts, and concurrent access to the per-writer log latch. They do not exercise scheduled retry/deadline integration. CI currently shows only the two passing label checks, with no build or test results yet. |
|
|
I meant that Single pushes calculate the revive deadline before scheduling; merged pushes calculate it inside the scheduled task, so revive completion during backoff versus remaining pending at the deadline are useful cases to cover. This was a coverage suggestion, not a newly identified correctness issue. The helper and latch tests you added are useful. |
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Looks good from the code review; no P0/P1 issues found. I checked that the shared scheduling helper preserves all five retry paths. The new tests address the callback-wiring part of my suggestion: they check the requested 100 ms delay, complete revive before invoking the captured retry, and verify both single and merged resends, plus single-push cleanup. Deadline expiry and retry exhaustion remain outside this coverage. CI currently shows passing label checks only; seven workflows await maintainer approval, so there are no build/test results yet. |
|
Thanks for adding the retry tests. I noticed two remaining edge cases:
|
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Thanks for addressing both review points. One small documentation follow-up: the description of |
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
@zaynt4606 thanks, good catch. Updated in 79fa9fd: the |
|
Thanks @venkata91 for the contribution! |
JIRA: CELEBORN-2470
Summary
Push retries currently run immediately and can synchronize across many tasks, increasing connection and DNS load when a worker is unhealthy. Hard splits can also emit the same INFO log repeatedly while pushes continue targeting the old file.
This PR:
PartitionDataWriter, for both disk and memory filesConfiguration
celeborn.client.push.retry.backoff.initial500msceleborn.client.push.retry.backoff.max10sceleborn.client.push.retry.backoff.jitter0.5Setting
celeborn.client.push.retry.backoff.initialto0disables backoff.celeborn.client.push.retry.backoff.maxcaps the final delay, including jitter, so with the defaults a retry at the cap waits between 5s and 10s.Tests
HARD_SPLITretries and revive completion during backoffHARD_SPLITchecks log only once