{"record":{"id":"e4148d0df027d650","repo":"apache/seatunnel","slug":"failed-to-evaluate-recovered-split-re-enqueue","errorCode":null,"errorMessage":"Failed to evaluate recovered split {}, re-enqueue it conservatively.","messagePattern":"Failed to evaluate recovered split (.+?), re-enqueue it conservatively\\.","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":542,"sourceCode":"            FileStatus sourceStatus;\n            try {\n                sourceStatus = context.sourceFs.getFileStatus(split.getFilePath());\n            } catch (IOException e) {\n                if (log.isDebugEnabled()) {\n                    log.debug(\n                            \"Skip recovering split because source file status cannot be resolved: {}\",\n                            maskUriUserInfo(split.getFilePath()),\n                            e);\n                }\n                skipped++;\n                continue;\n            }\n\n            boolean shouldProcess;\n            try {\n                shouldProcess = context.shouldProcess(sourceStatus, jobStartTimeMillis, startMode);\n            } catch (IOException e) {\n                log.warn(\n                        \"Failed to evaluate recovered split {}, re-enqueue it conservatively.\",\n                        maskUriUserInfo(split.getFilePath()),\n                        e);\n                shouldProcess = true;\n            }\n            if (!shouldProcess) {\n                skipped++;\n                continue;\n            }\n\n            synchronized (lock) {\n                pendingSplits.addLast(split);\n                pendingSplitIds.add(split.splitId());\n                SplitVersion splitVersion = SplitVersion.fromFileStatus(sourceStatus);\n                pendingSplitVersions.put(split.splitId(), splitVersion);\n                knownSplitVersions.put(split.splitId(), splitVersion);\n            }\n            recovered++;","sourceCodeStart":524,"sourceCodeEnd":560,"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#L524-L560","documentation":"When recovering splits from a checkpoint, the enumerator calls context.shouldProcess(sourceStatus, jobStartTimeMillis, startMode) to decide whether a recovered split still needs processing. If that evaluation throws an IOException (e.g. probing file status fails), it logs this warning and conservatively sets shouldProcess = true, so the split is re-enqueued and reprocessed rather than skipped. This favors reprocessing over data loss.","triggerScenarios":"recoverSplitsFromCheckpoint processing a split whose source file status cannot be evaluated — the file or its directory is temporarily inaccessible, or the filesystem throws while checking status/paths needed by shouldProcess.","commonSituations":"Restart from checkpoint while the source filesystem is degraded; files deleted between checkpoint and recovery; transient FS errors at job recovery time.","solutions":["Fix the underlying filesystem error shown in the logged exception","Expect possible duplicate reprocessing of the affected splits; ensure downstream can tolerate or deduplicate re-reads","Verify source paths referenced by the checkpoint still exist before restarting the job"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// Before restoring, confirm all checkpointed split source files still exist\nfor (FileSourceSplit s : recoveredSplits) {\n    if (!fs.exists(s.getFilePath())) {\n        log.warn(\"Recovered split source missing: {}\", s.getFilePath());\n    }\n}","typeGuard":null,"tryCatchPattern":"try {\n    shouldProcess = context.shouldProcess(sourceStatus, jobStartTimeMillis, startMode);\n} catch (IOException e) {\n    log.warn(\"Failed to evaluate recovered split {}, re-enqueue it conservatively.\",\n            maskUriUserInfo(split.getFilePath()), e);\n    shouldProcess = true;\n}","preventionTips":["Verify source files referenced by checkpoints still exist before restarting","Restore only on a healthy filesystem connection","Design downstream sinks to deduplicate re-read data, since conservative re-enqueue may reprocess files"],"tags":["file-connector","checkpoint-recovery","filesystem"],"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-14T16:17:12.679Z"}