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.

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)

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.