apache/seatunnel · error · CheckpointStorageException

No checkpoint found for job, job id is: ${jobId}

Error message

No checkpoint found for job, job id is: ${jobId}

What it means

HdfsStorage.getAllCheckpoints lists checkpoint files under the job's directory and deserializes each into PipelineState. If no readable checkpoint states are found for the given jobId — directory empty, missing, or all files failing to read (read failures are only logged, not fatal) — it throws this CheckpointStorageException naming the jobId.

Source

Thrown at seatunnel-engine/seatunnel-engine-storage/checkpoint-storage-plugins/checkpoint-storage-hdfs/src/main/java/org/apache/seatunnel/engine/checkpoint/storage/hdfs/HdfsStorage.java:157

    @Override
    public List<PipelineState> getAllCheckpoints(String jobId) throws CheckpointStorageException {
        String path = getStorageParentDirectory() + jobId;
        List<String> fileNames = getFileNames(path);
        if (fileNames.isEmpty()) {
            log.info("No checkpoint found for this job, the job id is: " + jobId);
            return new ArrayList<>();
        }
        List<PipelineState> states = new ArrayList<>();
        fileNames.forEach(
                file -> {
                    try {
                        states.add(readPipelineState(file, jobId));
                    } catch (CheckpointStorageException e) {
                        log.error("Failed to read checkpoint data from file: " + file, e);
                    }
                });
        if (states.isEmpty()) {
            throw new CheckpointStorageException(
                    "No checkpoint found for job, job id is: " + jobId);
        }
        return states;
    }

    @Override
    public List<PipelineState> getLatestCheckpoint(String jobId) throws CheckpointStorageException {
        String path = getStorageParentDirectory() + jobId;
        List<String> fileNames = getFileNames(path);
        if (fileNames.isEmpty()) {
            log.info("No checkpoint found for this  job, the job id is: " + jobId);
            return new ArrayList<>();
        }
        Set<String> latestPipelineNames = getLatestPipelineNames(fileNames);
        List<PipelineState> latestPipelineStates = new ArrayList<>();
        latestPipelineNames.forEach(
                fileName -> {
                    try {

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Verify the jobId is correct by listing running/finished jobs via the REST API
  2. Confirm the checkpoint storage base directory config matches where the job actually wrote (same fs.defaultFS and path)
  3. List the job directory on HDFS (hdfs dfs -ls <storage-parent>/<jobId>) to see whether files exist
  4. Check server logs for 'Failed to read checkpoint data from file' entries indicating corrupt files
  5. If checkpoints were deleted, restart the job without savepoint restore instead

Example fix

// before
// assume default storage dir
List<PipelineState> states = hdfsStorage.getAllCheckpoints(jobId);
// after
// ensure same base dir the writer used
Map<String,String> cfg = Map.of(
    "storage.type", "hdfs",
    "fs.defaultFS", "hdfs://namenode:8020",
    "storage.path", "/seatunnel/checkpoints"); // matches writer config
HdfsStorage hdfsStorage = new HdfsStorage(cfg);
List<PipelineState> states = hdfsStorage.getAllCheckpoints(jobId);
Defensive patterns

Strategy: try-catch

Validate before calling

// check checkpoint files exist before calling getAllCheckpoints
Path jobDir = new Path(baseDir + "/" + jobId);
if (!fs.exists(jobDir) || fs.listStatus(jobDir).length == 0) {
  throw new IllegalStateException("No checkpoint directory/files for jobId " + jobId);
}

Try / catch

try {
  List<PipelineState> states = storage.getAllCheckpoints(jobId);
} catch (CheckpointStorageException e) {
  if (e.getMessage().startsWith("No checkpoint found for job")) {
    log.error("No checkpoints for jobId " + jobId + "; verify jobId and storage path, or restart without savepoint");
  } else throw e;
}

Prevention

When it happens

Trigger: Calling getAllCheckpoints(jobId) when: the job never wrote checkpoints (or storage config points to a different base directory than the one the job wrote to), the jobId is wrong/typo'd, all checkpoint files are corrupt (each read threw CheckpointStorageException and was logged), or files were deleted by cleanup/retention.

Common situations: Trying to restore/stop-with-savepoint a job whose checkpoints were purged by retention policy, pointing the client at a different cluster or namespace than where checkpoints were written, wrong jobId copied from logs, or corrupted files after a cluster crash leaving read failures in the logs.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


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