apache/seatunnel · warning
Post-sync operation cannot verify sink target and will be re
Error message
Post-sync operation cannot verify sink target and will be retried: action={}, source={}, target={}, checkpointId={} What it means
isSinkTargetCommitted() verifies the sink-side target file (computed via ctx.targetFilePath()) exists, matches the captured source length, and matches content before any source-side mutation. This WARN fires when that verification itself throws any exception — the sink filesystem cannot be queried or the content comparison fails unexpectedly. The method returns false so the post-sync operation is retried rather than proceeding on unverified state.
Source
Thrown at seatunnel-connectors-v2/connector-file/connector-file-base/src/main/java/org/apache/seatunnel/connectors/seatunnel/file/source/split/ContinuousMultipleTableFileSourceSplitEnumerator.java:1009
checkpointId,
op.getSourceLength(),
targetStatus == null ? null : targetStatus.getLen());
return false;
}
if (!isSinkTargetContentMatched(
ctx, op, targetPath, sourcePathToCompareWhenFingerprintMissing)) {
log.info(
"Post-sync operation is waiting for sink target content: action={}, "
+ "source={}, target={}, checkpointId={}",
op.getAction(),
maskUriUserInfo(op.getSourcePath()),
maskUriUserInfo(targetPath),
checkpointId);
return false;
}
return true;
} catch (Exception e) {
log.warn(
"Post-sync operation cannot verify sink target and will be retried: action={}, "
+ "source={}, target={}, checkpointId={}",
op.getAction(),
maskUriUserInfo(op.getSourcePath()),
maskUriUserInfo(targetPath),
checkpointId,
e);
return false;
}
}
private boolean isSinkTargetContentMatched(
TableScanContext ctx,
FileSourceOperationState op,
String targetPath,
String sourcePathToCompareWhenFingerprintMissing)
throws IOException {
if (StringUtils.isNotBlank(op.getSourceContentFingerprint())) {View on GitHub (pinned to cf67b549a7)
Solutions
- Read the stacked exception to identify the sink-filesystem failure (connectivity, permission, throttling)
- Verify the sink/target filesystem config and credentials (targetFs) are correct and reachable from the JobManager
- Check sink-target network stability and object-store rate limits; the operation retries automatically at the next checkpoint
- Ensure the target file path derived by ctx.targetFilePath() points into a filesystem the job can read
Example fix
// before (sink FS credentials expired) java.io.IOException: Cannot get file status for s3://bucket/target/... // after # refresh target FS credentials / verify hadoop-aws config, then restart or let the retry succeed
Defensive patterns
Strategy: retry
Validate before calling
// Before enabling post-sync delete/backup, verify the sink target filesystem is readable:
FileStatus t = targetFs.getFileStatus(targetFilePath(sourcePath));
if (t == null) throw new IOException("Sink target not visible: " + targetFilePath(sourcePath)); Try / catch
try {
verifySinkTarget(targetPath);
} catch (Exception e) {
// connectivity/permission/throttling on target FS; backoff and retry
} Prevention
- Validate sink (target) filesystem config and credentials at job startup
- Monitor target FS availability (NameNode health, S3 error rate, FTP keep-alive)
- Set sane timeouts for content comparison on large files
When it happens
Trigger: An exception is thrown while calling getFileStatusIfPresent(ctx.targetFs, targetPath), calculateContentFingerprint(ctx.targetFs, targetPath), or ctx.fileContentEquals(...) inside isSinkTargetCommitted() during checkpoint commit.
Common situations: Target filesystem (sink FS) temporarily unreachable (HDFS NameNode outage, S3 throttling, FTP connection drop); permission errors reading the sink target; timeout while streaming file contents for the byte comparison; misconfigured target FS credentials.
Understand the failure class
Background: "failed to read file", EACCES, ENOENT and "could not read <path>" errors: when a program can't read a file from disk — this error's family across 49 libraries.
Related errors
- Post-sync backup: rename-to-staging failed, will retry: sour
- Post-sync backup failed: backup target path is empty, splitI
- Post-sync backup cannot determine completion because source,
- Post-sync backup staging disappeared before verification; op
- Post-sync backup promotion target is absent after rename; op
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/c3069b6813261119.
Report an issue: GitHub.