{"record":{"id":"c3069b6813261119","repo":"apache/seatunnel","slug":"post-sync-operation-cannot-verify-sink-target-and","errorCode":null,"errorMessage":"Post-sync operation cannot verify sink target and will be retried: action={}, source={}, target={}, checkpointId={}","messagePattern":"Post-sync operation cannot verify sink target and will be retried: action=(.+?), source=(.+?), target=(.+?), checkpointId=(.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"seatunnel-connectors-v2/connector-file/connector-file-base/src/main/java/org/apache/seatunnel/connectors/seatunnel/file/source/split/ContinuousMultipleTableFileSourceSplitEnumerator.java","lineNumber":1009,"sourceCode":"                        checkpointId,\n                        op.getSourceLength(),\n                        targetStatus == null ? null : targetStatus.getLen());\n                return false;\n            }\n            if (!isSinkTargetContentMatched(\n                    ctx, op, targetPath, sourcePathToCompareWhenFingerprintMissing)) {\n                log.info(\n                        \"Post-sync operation is waiting for sink target content: action={}, \"\n                                + \"source={}, target={}, checkpointId={}\",\n                        op.getAction(),\n                        maskUriUserInfo(op.getSourcePath()),\n                        maskUriUserInfo(targetPath),\n                        checkpointId);\n                return false;\n            }\n            return true;\n        } catch (Exception e) {\n            log.warn(\n                    \"Post-sync operation cannot verify sink target and will be retried: action={}, \"\n                            + \"source={}, target={}, checkpointId={}\",\n                    op.getAction(),\n                    maskUriUserInfo(op.getSourcePath()),\n                    maskUriUserInfo(targetPath),\n                    checkpointId,\n                    e);\n            return false;\n        }\n    }\n\n    private boolean isSinkTargetContentMatched(\n            TableScanContext ctx,\n            FileSourceOperationState op,\n            String targetPath,\n            String sourcePathToCompareWhenFingerprintMissing)\n            throws IOException {\n        if (StringUtils.isNotBlank(op.getSourceContentFingerprint())) {","sourceCodeStart":991,"sourceCodeEnd":1027,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-file/connector-file-base/src/main/java/org/apache/seatunnel/connectors/seatunnel/file/source/split/ContinuousMultipleTableFileSourceSplitEnumerator.java#L991-L1027","documentation":"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.","triggerScenarios":"An exception is thrown while calling getFileStatusIfPresent(ctx.targetFs, targetPath), calculateContentFingerprint(ctx.targetFs, targetPath), or ctx.fileContentEquals(...) inside isSinkTargetCommitted() during checkpoint commit.","commonSituations":"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.","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"],"exampleFix":"// before (sink FS credentials expired)\njava.io.IOException: Cannot get file status for s3://bucket/target/...\n// after\n# refresh target FS credentials / verify hadoop-aws config, then restart or let the retry succeed","handlingStrategy":"retry","validationCode":"// Before enabling post-sync delete/backup, verify the sink target filesystem is readable:\nFileStatus t = targetFs.getFileStatus(targetFilePath(sourcePath));\nif (t == null) throw new IOException(\"Sink target not visible: \" + targetFilePath(sourcePath));","typeGuard":null,"tryCatchPattern":"try {\n    verifySinkTarget(targetPath);\n} catch (Exception e) {\n    // connectivity/permission/throttling on target FS; backoff and retry\n}","preventionTips":["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"],"tags":["hadoop","file-source","sink-verification","io","retryable"],"backgroundTag":"file-read-failed","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}