apache/seatunnel · error · RuntimeException

The checkpoint coordinator

Error message

The checkpoint coordinator(%s) don't exist

What it means

CheckpointManager.getCheckpointCoordinator looks up the CheckpointCoordinator for a pipeline in coordinatorMap; if none is registered for that pipelineId it throws a RuntimeException stating the coordinator doesn't exist. This means checkpoint operations (report progress, errors, etc.) are being routed to a pipeline the manager is not tracking on this node.

Solutions

  1. Verify the pipelineId belongs to the job and the pipeline is still running before calling
  2. Check whether the pipeline already completed/failed — in-flight checkpoint reports after completion should be ignored, not fatal
  3. Guard callers (e.g., reportCheckpointErrorFromTask) to catch/handle the missing-coordinator case for late messages
  4. After master failover, ensure CheckpointManager restore completed before processing checkpoint messages
  5. Log and inspect the jobId/pipelineId in the message to confirm it isn't from a previous job run with reused IDs

Example fix

// before
CheckpointCoordinator c = checkpointManager.getCheckpointCoordinator(pipelineId);
c.reportCheckpointErrorFromTask(errorMsg);

// after
try {
    checkpointManager.getCheckpointCoordinator(pipelineId)
        .reportCheckpointErrorFromTask(errorMsg);
} catch (RuntimeException e) {
    LOG.warn("Checkpoint coordinator for pipeline {} gone; late task report dropped", pipelineId);
}
Defensive patterns

Strategy: try-catch

Validate before calling

CheckpointCoordinator c = coordinatorMap.get(pipelineId);
if (c == null) { LOG.warn("No coordinator for pipeline {}", pipelineId); return; }

Type guard

Optional<CheckpointCoordinator> findCoordinator(int pipelineId) {
    return Optional.ofNullable(coordinatorMap.get(pipelineId));
}

Try / catch

try {
    manager.getCheckpointCoordinator(pipelineId).reportCheckpointErrorFromTask(msg);
} catch (RuntimeException e) {
    LOG.warn("Coordinator for pipeline {} missing; dropping late report", pipelineId);
}

Prevention

When it happens

Trigger: Calling getCheckpointCoordinator(pipelineId) (or task-based report APIs that delegate to it) with a pipelineId whose coordinator was never created, or was removed after the pipeline finished/failed; also after job cleanup while tasks still emit checkpoint messages.

Common situations: Task checkpoints arriving after pipeline completion (stale messages in flight); master failover where the new master hasn't restored that pipeline's coordinator; wrong pipelineId passed by custom code or a buggy connector.

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/f313ede1147994f4. Report an issue: GitHub.

Appendix: source

Thrown at seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/checkpoint/CheckpointManager.java:245

        }
    }

    protected void handleCheckpointError(int pipelineId, boolean neverRestore) {
        jobMaster.handleCheckpointError(pipelineId, neverRestore);
    }

    private CheckpointCoordinator getCheckpointCoordinator(TaskLocation taskLocation) {
        return getCheckpointCoordinator(taskLocation.getPipelineId());
    }

    public void reportCheckpointErrorFromTask(TaskLocation taskLocation, String errorMsg) {
        getCheckpointCoordinator(taskLocation).reportCheckpointErrorFromTask(errorMsg);
    }

    public CheckpointCoordinator getCheckpointCoordinator(int pipelineId) {
        CheckpointCoordinator coordinator = coordinatorMap.get(pipelineId);
        if (coordinator == null) {
            throw new RuntimeException(
                    String.format("The checkpoint coordinator(%s) don't exist", pipelineId));
        }
        return coordinator;
    }

    /**
     * Called by the {@link Task}. <br>
     * used by Task to report the {@link SeaTunnelTaskState} of the state machine.
     */
    public void reportedTask(TaskReportStatusOperation reportStatusOperation) {
        // task address may change during restore.
        log.debug(
                "reported task({}) status {}",
                reportStatusOperation.getLocation().getTaskID(),
                reportStatusOperation.getStatus());
        getCheckpointCoordinator(reportStatusOperation.getLocation())
                .reportedTask(reportStatusOperation);
    }

View on GitHub (pinned to cf67b549a7)