apache/flink · error · FlinkException

Could not stop with a savepoint job

Error message

Could not stop with a savepoint job "{}".

What it means

Thrown from NestedPrimitiveColumnReader.readPrimitiveValue when the physical/logical type combination of a nested column value falls through the switch without matching — e.g. a type root not handled in the plain-read path (only numeric, string/binary, and timestamp cases are covered; DECIMAL-over-INT32/INT64 falls through the inner switch, and types like TIME or BOOLEAN in some paths hit default). The message names the offending type.

Solutions

  1. Identify the type in the message and check NestedPrimitiveColumnReader.readPrimitiveValue's switch — is that type root handled?
  2. Avoid the unsupported nested type: cast/restructure the column at the source (flatten the array, change the type) or project it out
  3. Read such columns through a non-nested path or convert the file (e.g. with Spark) to types Flink supports nested
  4. If the type should be supported, open a Flink JIRA (parquet component) — the switch likely needs a new case
Defensive patterns

Strategy: type-guard

Validate before calling

// Before reading, check nested element types against the supported set
static final Set<LogicalTypeRoot> NESTED_SUPPORTED = Set.of(
    LogicalTypeRoot.CHAR, LogicalTypeRoot.VARCHAR, LogicalTypeRoot.BOOLEAN,
    LogicalTypeRoot.BINARY, LogicalTypeRoot.VARBINARY, LogicalTypeRoot.TINYINT,
    LogicalTypeRoot.SMALLINT, LogicalTypeRoot.INTEGER, LogicalTypeRoot.BIGINT,
    LogicalTypeRoot.FLOAT, LogicalTypeRoot.DOUBLE,
    LogicalTypeRoot.TIMESTAMP_WITHOUT_TIME_ZONE, LogicalTypeRoot.TIMESTAMP_WITH_LOCAL_TIME_ZONE);

for (LogicalType child : ((ArrayType) colType).getChildren()) {
    if (!NESTED_SUPPORTED.contains(child.getTypeRoot())) skipOrFlatten(colName);
}

Type guard

static boolean nestedTypeSupported(LogicalType t) {
    return NESTED_SUPPORTED.contains(t.getTypeRoot());
}

Try / catch

try {
    reader.readAndNewVector(...);
} catch (RuntimeException e) {
    if (String.valueOf(e.getMessage()).startsWith("Unsupported type in the list")) {
        // project out the column or convert the file
    } else throw e;
}

Prevention

When it happens

Trigger: Nested list/array elements of a logical type not covered by readPrimitiveValue's switch (e.g. TIME, DATE in certain physical mappings, DECIMAL variants not matching the inner switch); new Flink logical types added without extending this legacy switch.

Common situations: Arrays of decimal, time, or boolean inside Parquet lists/maps; schema evolution introducing new type roots; reading files whose logical type annotations don't match Flink's expectations.

Related errors


AI-assisted analysis of apache/flink@2f3c205e92 (2026-08-14). Data as JSON: /api/errors/d8cb1c0ed2735819. Report an issue: GitHub.

Appendix: source

Thrown at flink-clients/src/main/java/org/apache/flink/client/cli/CliFrontend.java:824

            String targetDirectory,
            SavepointFormatType formatType,
            Duration clientTimeout)
            throws FlinkException {
        logAndSysout("Triggering stop-with-savepoint for job " + jobId + '.');

        CompletableFuture<String> savepointPathFuture =
                clusterClient.stopWithSavepoint(
                        jobId, advanceToEndOfEventTime, targetDirectory, formatType);

        logAndSysout("Waiting for response...");

        try {
            final String savepointPath =
                    savepointPathFuture.get(clientTimeout.toMillis(), TimeUnit.MILLISECONDS);

            logAndSysout("Savepoint completed. Path: " + savepointPath);
        } catch (Exception e) {
            throw new FlinkException("Could not stop with a savepoint job \"" + jobId + "\".", e);
        }
    }

    /** Sends a SavepointTriggerMessage to the job manager in detached mode. */
    private void stopWithDetachedSavepoint(
            ClusterClient<?> clusterClient,
            JobID jobId,
            boolean advanceToEndOfEventTime,
            String targetDirectory,
            SavepointFormatType formatType,
            Duration clientTimeout)
            throws FlinkException {
        logAndSysout("Triggering stop-with-savepoint in detached mode for job " + jobId + '.');
        try {
            final String triggerId =
                    clusterClient
                            .stopWithDetachedSavepoint(
                                    jobId, advanceToEndOfEventTime, targetDirectory, formatType)

View on GitHub (pinned to 2f3c205e92)