apache/seatunnel · error

Retention delete failed: file=

Error message

Retention delete failed: file={}, expireBefore={}

What it means

Logged by ContinuousMultipleTableFileSourceSplitEnumerator during per-file retention cleanup when deleting an expired backup version file fails. The file is counted as a failed operation and skipped; the scan continues instead of aborting.

Solutions

  1. Check filesystem permissions on the backup files
  2. Verify files still exist / are not locked by other processes
  3. Retry on the next retention scan cycle; investigate recurring failures
Defensive patterns

Strategy: fallback

When it happens

Trigger: Thrown at seatunnel-connectors-v2/connector-file/connector-file-base/src/main/java/org/apache/seatunnel/connectors/seatunnel/file/source/split/ContinuousMultipleTableFileSourceSplitEnumerator.java:1261 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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

Appendix: source

Thrown at seatunnel-connectors-v2/connector-file/connector-file-base/src/main/java/org/apache/seatunnel/connectors/seatunnel/file/source/split/ContinuousMultipleTableFileSourceSplitEnumerator.java:1261

                continue;
            }
            if (!status.isFile()) {
                continue;
            }
            if (!BACKUP_VERSION_SUFFIX_PATTERN.matcher(status.getPath().getName()).matches()) {
                continue;
            }
            if (resolveBackupCreatedTimeMillis(status) > expireBefore) {
                continue;
            }
            try {
                fs.deleteFile(status.getPath().toString());
                result.deletedFiles++;
                incCounter(retentionDeletedCounter);
            } catch (Exception e) {
                result.failedOperations++;
                incCounter(retentionFailedCounter);
                log.warn(
                        "Retention delete failed: file={}, expireBefore={}",
                        maskUriUserInfo(status.getPath().toString()),
                        expireBefore,
                        e);
            }
        }
    }

    private long resolveBackupCreatedTimeMillis(FileStatus status) {
        java.util.regex.Matcher matcher =
                BACKUP_VERSION_SUFFIX_PATTERN.matcher(status.getPath().getName());
        if (matcher.matches() && matcher.group(3) != null) {
            try {
                return Long.parseLong(matcher.group(3));
            } catch (NumberFormatException ignored) {
                // Fall through to filesystem mtime for malformed legacy file names.
            }
        }

View on GitHub (pinned to cf67b549a7)