{"record":{"id":"2a1ce19b11f45164","repo":"apache/seatunnel","slug":"post-sync-backup-promotion-target-is-absent-after","errorCode":null,"errorMessage":"Post-sync backup promotion target is absent after rename; operation will be retried: splitId={}, source={}, target={}, checkpointId={}","messagePattern":"Post-sync backup promotion target is absent after rename; operation will be retried: splitId=(.+?), 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":935,"sourceCode":"                    maskUriUserInfo(stagingPath),\n                    checkpointId);\n            return OpCommitResult.FAILED_RETRYABLE;\n        }\n\n        if (!isOperationContentMatched(ctx, op, stagingPath, stagingStatus)) {\n            return handleStaleStagedOperation(\n                    ctx, op, checkpointId, stagingPath, \"backup\", stagingStatus);\n        }\n\n        if (!isSinkTargetCommitted(ctx, op, checkpointId, stagingPath)) {\n            return handleRetryableStagedOperation(\n                    ctx, op, checkpointId, stagingPath, \"backup\", stagingStatus);\n        }\n\n        ctx.sourceFs.renameFile(stagingPath, op.getBackupTargetPath(), false);\n        targetStatus = getFileStatusIfPresent(ctx.sourceFs, op.getBackupTargetPath());\n        if (targetStatus == null) {\n            log.warn(\n                    \"Post-sync backup promotion target is absent after rename; operation will be retried: \"\n                            + \"splitId={}, source={}, target={}, checkpointId={}\",\n                    op.getSplitId(),\n                    maskUriUserInfo(op.getSourcePath()),\n                    maskUriUserInfo(op.getBackupTargetPath()),\n                    checkpointId);\n            return OpCommitResult.FAILED_RETRYABLE;\n        }\n        if (!isOperationContentMatched(ctx, op, op.getBackupTargetPath(), targetStatus)) {\n            log.warn(\n                    \"Post-sync backup promoted an unexpected target version; operation will be retried: \"\n                            + \"splitId={}, source={}, target={}, checkpointId={}\",\n                    op.getSplitId(),\n                    maskUriUserInfo(op.getSourcePath()),\n                    maskUriUserInfo(op.getBackupTargetPath()),\n                    checkpointId);\n            return OpCommitResult.FAILED_RETRYABLE;\n        }","sourceCodeStart":917,"sourceCodeEnd":953,"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#L917-L953","documentation":"This WARN fires when the final promotion rename (staging -> backup target) appears to succeed but a subsequent getFileStatus on the backup target path returns null, meaning the promoted file cannot be seen. The operation returns FAILED_RETRYABLE. It typically reflects object-store eventual consistency, a lost rename, or something deleting the target right after promotion.","triggerScenarios":"ctx.sourceFs.renameFile(stagingPath, op.getBackupTargetPath(), false) completes without exception, then getFileStatusIfPresent(ctx.sourceFs, op.getBackupTargetPath()) returns null.","commonSituations":"S3/OSS/Azure eventual-consistency lag right after rename; backup target path cleaned by a TTL job seconds after promotion; filesystem outage dropping the rename silently; wrong bucket/container permissions letting the rename be a no-op wrapper.","solutions":["Verify the backup target path in the log exists via an independent client (hdfs dfs -ls / aws s3 ls)","Check for cleanup jobs racing on the backup directory and exclude the in-flight target","If on an eventually-consistent object store, rely on the built-in retry at the next checkpoint rather than manual action","Check filesystem/rename implementation health (NameNode logs, S3 error rates) around the timestamp of the warning"],"exampleFix":"null","handlingStrategy":"retry","validationCode":"// Post-rename verification in your own pipelines:\nFileStatus t = fs.getFileStatus(targetPath); // throws FileNotFoundException if lost\nif (t == null || t.getLen() != expectedLen) { retryOrAlert(); }","typeGuard":null,"tryCatchPattern":"try {\n    fs.renameFile(staging, target, false);\n    if (fs.getFileStatus(target) == null) { retryWithBackoff(); }\n} catch (IOException e) {\n    retryWithBackoff();\n}","preventionTips":["Independently verify promoted files with an out-of-band client after backups","Exclude backup directories from TTL/cleanup jobs","Accept the built-in retry-on-next-checkpoint behavior for eventual-consistency lag"],"tags":["hadoop","file-source","backup","consistency","retryable"],"backgroundTag":"unexpected-response-shape","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"}