apache/seatunnel · error · RuntimeException

The checkpoint coordinator(%s) don't exist

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.

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)

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.