{"record":{"id":"54ce014aefffa32c","repo":"apache/seatunnel","slug":"post-sync-backup-staging-disappeared-before-verifi","errorCode":null,"errorMessage":"Post-sync backup staging disappeared before verification; operation will be retried: splitId={}, source={}, staging={}, checkpointId={}","messagePattern":"Post-sync backup staging disappeared before verification; operation will be retried: splitId=(.+?), source=(.+?), staging=(.+?), 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":912,"sourceCode":"            return OpCommitResult.FAILED_RETRYABLE;\n        }\n\n        if (stagingStatus == null) {\n            try {\n                ctx.sourceFs.renameFile(op.getSourcePath(), stagingPath, false);\n            } catch (Exception e) {\n                log.warn(\n                        \"Post-sync backup: rename-to-staging failed, will retry: source={}, staging={}\",\n                        maskUriUserInfo(op.getSourcePath()),\n                        maskUriUserInfo(stagingPath),\n                        e);\n                return OpCommitResult.FAILED_RETRYABLE;\n            }\n            stagingStatus = getFileStatusIfPresent(ctx.sourceFs, stagingPath);\n        }\n\n        if (stagingStatus == null) {\n            log.warn(\n                    \"Post-sync backup staging disappeared before verification; operation will be retried: \"\n                            + \"splitId={}, source={}, staging={}, checkpointId={}\",\n                    op.getSplitId(),\n                    maskUriUserInfo(op.getSourcePath()),\n                    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        }","sourceCodeStart":894,"sourceCodeEnd":930,"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#L894-L930","documentation":"After the enumerator renames the source into the staging path, it re-checks the staging file before verification. This WARN fires when that re-check finds nothing: the staged file disappeared between the rename and the verification. The operation is retried (FAILED_RETRYABLE). It signals an external actor or FS inconsistency removing the staged file.","triggerScenarios":"renameFile(source -> staging) reports success, but the immediately following getFileStatusIfPresent(ctx.sourceFs, stagingPath) returns null.","commonSituations":"A cleanup/TTL job or another pipeline instance deleting files under the staging directory; concurrent job instances using the same staging path; object-store listing inconsistency right after rename (S3/OSS eventual consistency); manual operator intervention.","solutions":["Ensure only one job instance runs against the same source/staging paths; kill duplicate pipelines","Exclude the staging directory from external cleanup/TTL jobs","Use a job-unique staging path (buildBackupStagingPath input) so concurrent runs never collide","If using an eventually-consistent object store, increase the retry interval so listings settle"],"exampleFix":"null","handlingStrategy":"retry","validationCode":"// After a successful rename, verify the staged file before proceeding in your own tooling\nif (!fs.exists(stagingPath)) {\n    throw new IOException(\"Staged file missing right after rename: \" + stagingPath);\n}","typeGuard":null,"tryCatchPattern":"try {\n    verifyStaged(stagingPath);\n} catch (IOException e) {\n    // transient disappearance: backoff, re-list, retry\n}","preventionTips":["Do not run cleanup jobs against the staging directory","Use job-unique staging paths to avoid cross-pipeline collisions","On eventually-consistent stores, allow settle time before verification"],"tags":["hadoop","file-source","staging","file-not-found","retryable"],"backgroundTag":"file-not-found","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"}