apache/seatunnel · error · CheckpointStorageException

No checkpoint found, job(${jobId}), pipeline(${pipelineId}),

Error message

No checkpoint found, job(${jobId}), pipeline(${pipelineId}), checkpoint(${checkpointId})

What it means

LocalFileStorage.getCheckpoint throws CheckpointStorageException after exhausting all candidate files without finding a readable checkpoint whose file name matches the requested job, pipeline, and checkpoint id. Each candidate file that fails to parse is logged (with the underlying exception) and skipped; if none match or deserialize, this terminal 'No checkpoint found' error is thrown. It signals the checkpoint data is absent or unreadable/corrupt for the given ids.

Source

Thrown at seatunnel-engine/seatunnel-engine-storage/checkpoint-storage-plugins/checkpoint-storage-local-file/src/main/java/org/apache/seatunnel/engine/checkpoint/storage/localfile/LocalFileStorage.java:318

        }
        for (File file : fileList) {
            String fileName = file.getName();
            if (pipelineId.equals(getPipelineIdByFileName(fileName))
                    && checkpointId.equals(getCheckpointIdByFileName(fileName))) {
                try {
                    byte[] data = FileUtils.readFileToByteArray(file);
                    return deserializeCheckPointData(data);
                } catch (Exception e) {
                    log.error(
                            "Failed to delete checkpoint {} for job {}, pipeline {}",
                            checkpointId,
                            jobId,
                            pipelineId,
                            e);
                }
            }
        }
        throw new CheckpointStorageException(
                String.format(
                        "No checkpoint found, job(%s), pipeline(%s), checkpoint(%s)",
                        jobId, pipelineId, checkpointId));
    }

    @Override
    public synchronized void deleteCheckpoint(String jobId, String pipelineId, String checkpointId)
            throws CheckpointStorageException {
        String parentPath = getStorageParentDirectory() + jobId;
        Collection<File> fileList = new ArrayList<>();
        try {
            fileList = FileUtils.listFiles(new File(parentPath), FILE_EXTENSIONS, false);
        } catch (Exception e) {
            if (!(e.getCause() instanceof NoSuchFileException)) {
                throw new CheckpointStorageException(ExceptionUtils.getMessage(e));
            }
        }
        if (fileList.isEmpty()) {

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Verify the jobId/pipelineId/checkpointId triple actually exists — list the files under the storage directory for the job.
  2. Check the preceding log lines: the method logs the per-file exception (e) with jobId/pipelineId, revealing whether files are corrupt.
  3. If files are truncated/corrupt, recover from an earlier completed checkpoint or re-run the job.
  4. For multi-node deployments, use a shared checkpoint storage plugin (e.g. HDFS/OSS/S3) instead of local file so the data is reachable from the querying node.

Example fix

// before
storage.getCheckpoint(jobId, pipelineId, latestCheckpointId); // throws if file unreadable
// after
try {
    return storage.getCheckpoint(jobId, pipelineId, latestCheckpointId);
} catch (CheckpointStorageException e) {
    log.warn("Checkpoint {}/{}/{} unavailable, falling back", jobId, pipelineId, latestCheckpointId, e);
    return storage.getLatestCheckpointByJobIdAndPipelineId(jobId, pipelineId);
}
Defensive patterns

Strategy: fallback

Validate before calling

// Verify the checkpoint file actually exists before requesting it
java.nio.file.Path jobDir = java.nio.file.Path.of(storageParentDir, jobId);
boolean exists = java.nio.file.Files.isDirectory(jobDir)
    && java.util.stream.Stream.of(jobDir.toFile().listFiles()).anyMatch(f -> f.getName().contains(pipelineId));

Try / catch

try {
    return storage.getCheckpoint(jobId, pipelineId, checkpointId);
} catch (CheckpointStorageException e) {
    log.warn("Checkpoint {}/{}/{} not found or unreadable; falling back to latest", jobId, pipelineId, checkpointId, e);
    return storage.getLatestCheckpointByJobIdAndPipelineId(jobId, pipelineId);
}

Prevention

When it happens

Trigger: Calling getCheckpoint(jobId, pipelineId, checkpointId) when the job directory contains no files named for that pipeline/checkpoint combination, or all matching files fail to deserialize (corrupt/partially written checkpoint data files).

Common situations: Requesting a checkpoint id that was never completed (only completed checkpoints are stored); checkpoint files truncated by an abrupt node kill; local storage lost after a container restart in Kubernetes; asking for checkpoints from a job that ran on a different node with non-shared local storage.

Understand the failure class

Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/4735ad53e4e7691e. Report an issue: GitHub.