apache/seatunnel · warning · IOException

Interrupted during Doris retry backoff

Error message

Interrupted during Doris retry backoff

What it means

The Doris committer sleeps with exponential backoff (1s, 2s, 4s, 8s, 16s capped) between HTTP retries. If the sleeping thread is interrupted, it re-asserts the interrupt flag and throws this IOException so the commit/abort operation unwinds promptly instead of silently resuming retries.

Source

Thrown at seatunnel-connectors-v2/connector-doris/src/main/java/org/apache/seatunnel/connectors/doris/sink/committer/DorisCommitter.java:276

            } else {
                log.info("load result {}", loadResult);
            }
        }
    }

    private void sleepBeforeNextAttempt(int attempt) throws IOException {
        if (attempt < maxRetry) {
            retrySleeper.sleep(attempt + 1);
        }
    }

    private static void sleepBeforeRetry(int retry) throws IOException {
        try {
            int shift = Math.min(Math.max(retry - 1, 0), 4);
            Thread.sleep(1000L * (1L << shift));
        } catch (InterruptedException ie) {
            Thread.currentThread().interrupt();
            throw new IOException("Interrupted during Doris retry backoff", ie);
        }
    }

    private void handleAbortSuccess(DorisCommitInfo committable, CloseableHttpResponse response)
            throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        String loadResult = EntityUtils.toString(response.getEntity());
        Map<String, String> res =
                mapper.readValue(loadResult, new TypeReference<HashMap<String, String>>() {});
        if (!LoadStatus.SUCCESS.equals(res.get("status"))) {
            if (ResponseUtil.isCommitted(res.get("msg"))) {
                throw new DorisConnectorException(
                        DorisConnectorErrorCode.STREAM_LOAD_FAILED,
                        "try abort committed transaction, " + "do you recover from old savepoint?");
            }
            log.warn(
                    "Fail to abort transaction. txnId: {}, error: {}",
                    committable.getTxbID(),

View on GitHub (pinned to cf67b549a7)

Solutions

  1. This usually accompanies an intentional cancellation — check the job/engine logs for the original cancel reason
  2. If it happens during long retries, fix the underlying Doris connectivity so retries don't stack up
  3. Reduce checkpoint/transaction timeout mismatch so the job fails cleanly rather than retrying until cancellation
  4. No code fix needed; the interrupt flag is properly restored by the connector
Defensive patterns

Strategy: retry

Try / catch

try { committer.commit(c); } catch (IOException e) { if (e.getMessage().contains("Interrupted during Doris retry backoff")) { /* job is being cancelled; do not swallow — restore/cleanup and exit */ Thread.currentThread().interrupt(); } }

Prevention

When it happens

Trigger: Thread.interrupt() is delivered while sleepBeforeRetry is in Thread.sleep — typically when the SeaTunnel engine cancels the job, a checkpoint timeout triggers task cancellation, or the JVM is shutting down.

Common situations: User cancels the SeaTunnel job while a Doris retry backoff is in progress; checkpoint expired and the engine interrupts the task thread; cluster shutdown.

Understand the failure class

Background: Request timed out: what client-side request timeouts mean across libraries (Request timed out, TIMED_OUT, APITimeoutError) — this error's family across 39 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/04f3140294c392e3. Report an issue: GitHub.