apache/seatunnel · warning

Post-sync operation failed: table context not found…

Error message

Post-sync operation failed: table context not found, tableId={}, splitId={}

What it means

commitSingleOperation looks up the TableScanContext for a pending post-sync operation by its tableId. If the context cannot be found, it logs this warning and returns OpCommitResult.FAILED_RETRYABLE, so the post-sync operation (backup/delete/etc.) is not executed and will be retried later. The operation cannot proceed without the table's scan context (source FS, trash path, etc.).

Solutions

  1. Ensure the job config tables match those referenced by the checkpoint/savepoint being restored from
  2. Restart with a fresh checkpoint if table definitions changed intentionally
  3. Verify addTableScanContext registration happens for every table that produces post-sync operations
Defensive patterns

Strategy: retry

Validate before calling

// Before persisting post-sync op state, ensure its tableId is registered
if (!findTableScanContext(op.getTableId()).isPresent()) {
    throw new IllegalStateException(
            "Cannot queue post-sync op for unregistered tableId=" + op.getTableId());
}

Try / catch

Optional<TableScanContext> ctx = findTableScanContext(op.getTableId());
if (!ctx.isPresent()) {
    log.warn("Post-sync operation failed: table context not found, tableId={}, splitId={}",
            op.getTableId(), op.getSplitId());
    return OpCommitResult.FAILED_RETRYABLE;
}

Prevention

When it happens

Trigger: A file post-sync operation state references a tableId absent from the enumerator's registered table contexts — e.g. table reconfiguration mid-job, state restored from a mismatched checkpoint, or contexts cleared before commit.

Common situations: Job restart from a checkpoint created under a different table configuration; table removed from config while its queued post-sync ops still exist; restore across config edits.

Understand the failure class

Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.

Related errors


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

Appendix: source

Thrown at seatunnel-connectors-v2/connector-file/connector-file-base/src/main/java/org/apache/seatunnel/connectors/seatunnel/file/source/split/ContinuousMultipleTableFileSourceSplitEnumerator.java:700

                    remainingByCheckpoint.entrySet()) {
                pendingOpsByCheckpoint.put(entry.getKey(), entry.getValue());
            }
        }

        log.info(
                "Post-sync commit finished for checkpoint {}: attempted={}, success={}, stale_skipped={}, failed={}, remaining_checkpoints={}",
                checkpointId,
                attempted,
                succeeded,
                staleSkipped,
                failed,
                remainingByCheckpoint.size());
    }

    private OpCommitResult commitSingleOperation(FileSourceOperationState op, long checkpointId) {
        Optional<TableScanContext> tableContextOpt = findTableScanContext(op.getTableId());
        if (!tableContextOpt.isPresent()) {
            log.warn(
                    "Post-sync operation failed: table context not found, tableId={}, splitId={}",
                    op.getTableId(),
                    op.getSplitId());
            return OpCommitResult.FAILED_RETRYABLE;
        }

        try {
            if (op.getAction() == FilePostSyncAction.DELETE) {
                return commitDeleteOperation(tableContextOpt.get(), op, checkpointId);
            }
            if (op.getAction() == FilePostSyncAction.BACKUP) {
                return commitBackupOperation(tableContextOpt.get(), op, checkpointId);
            }
            return OpCommitResult.SUCCESS;
        } catch (Exception e) {
            log.warn(
                    "Post-sync operation failed and will be retried: action={}, splitId={}, source={}, retryCount={}",
                    op.getAction(),

View on GitHub (pinned to cf67b549a7)