apache/seatunnel · error · UnsupportedOperationException

Checkpoint storage is unavailable

Error message

Checkpoint storage is unavailable

What it means

JobMaster's checkpoint storage delegate has not been initialized, so its CheckpointStorageOperations implementation is a stub that throws UnsupportedOperationException('Checkpoint storage is unavailable') for every checkpoint operation. storeCheckPoint would persist a pipeline's checkpoint state but the backing storage is not wired up in this JobMaster instance.

Solutions

  1. Verify the job was submitted with checkpointing enabled and that the Zeta master node initialized checkpoint storage successfully
  2. Inspect master node logs for earlier initialization errors that left the checkpoint storage unavailable and fix the root cause
  3. Restart the cluster so the JobMaster rebuilds its checkpoint storage binding before the job restores/saves state
  4. If running programmatically/tests, construct the JobMaster with a real checkpoint storage implementation rather than the unavailable stub
Defensive patterns

Strategy: try-catch

Validate before calling

// Before relying on checkpoint persistence, verify the master's storage is bound:
// check job checkpointing config and master startup logs; there is no public API flag,
// so guard operationally.
boolean checkpointStorageReady = jobMaster != null && clusterMasterLogsShowCheckpointStorageInitialized;

Try / catch

try {
    jobMaster.storeCheckPoint(pipelineState);
} catch (UnsupportedOperationException e) {
    if ("Checkpoint storage is unavailable".equals(e.getMessage())) {
        // re-init/restart master checkpoint storage, then retry
    } else {
        throw e;
    }
}

Prevention

When it happens

Trigger: Calling JobMaster.storeCheckPoint(PipelineState) on a JobMaster whose checkpoint storage accessor is not available — typically before/without proper checkpoint storage initialization or in a mode where checkpoint persistence is disabled.

Common situations: Running jobs with checkpointing expected but the checkpoint storage service (e.g. IMap-based storage on the master node) failed to initialize; calling checkpoint APIs programmatically against a JobMaster constructed in tests or degraded mode; engine version changes that altered checkpoint storage bootstrap.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


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

Appendix: source

Thrown at seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/master/JobMaster.java:388

        if (checkpointEnabled && startWithSavePoint) {
            throw new IllegalStateException(
                    "Checkpoint is enabled and job starts with savepoint, but checkpoint storage is not available");
        }

        // When checkpoint is disabled, CheckpointManager will not touch the storage. We still need
        // a non-null placeholder to avoid NPEs during job initialization (especially in local
        // example runs where SeaTunnelServer components may initialize asynchronously).
        return new UnsupportedCheckpointStorage();
    }

    private static final class UnsupportedCheckpointStorage implements CheckpointStorage {
        private static UnsupportedOperationException unavailable() {
            return new UnsupportedOperationException("Checkpoint storage is unavailable");
        }

        @Override
        public String storeCheckPoint(PipelineState state) {
            throw unavailable();
        }

        @Override
        public void asyncStoreCheckPoint(PipelineState state) {
            throw unavailable();
        }

        @Override
        public List<PipelineState> getAllCheckpoints(String jobId) {
            throw unavailable();
        }

        @Override
        public List<PipelineState> getLatestCheckpoint(String jobId) {
            throw unavailable();
        }

        @Override

View on GitHub (pinned to cf67b549a7)