{"record":{"id":"d8cb1c0ed2735819","repo":"apache/flink","slug":"could-not-stop-with-a-savepoint-job","errorCode":null,"errorMessage":"Could not stop with a savepoint job \"{}\".","messagePattern":"Could not stop with a savepoint job \"(.+?)\"\\.","errorType":"exception","errorClass":"FlinkException","httpStatus":null,"severity":"error","filePath":"flink-clients/src/main/java/org/apache/flink/client/cli/CliFrontend.java","lineNumber":824,"sourceCode":"            String targetDirectory,\n            SavepointFormatType formatType,\n            Duration clientTimeout)\n            throws FlinkException {\n        logAndSysout(\"Triggering stop-with-savepoint for job \" + jobId + '.');\n\n        CompletableFuture<String> savepointPathFuture =\n                clusterClient.stopWithSavepoint(\n                        jobId, advanceToEndOfEventTime, targetDirectory, formatType);\n\n        logAndSysout(\"Waiting for response...\");\n\n        try {\n            final String savepointPath =\n                    savepointPathFuture.get(clientTimeout.toMillis(), TimeUnit.MILLISECONDS);\n\n            logAndSysout(\"Savepoint completed. Path: \" + savepointPath);\n        } catch (Exception e) {\n            throw new FlinkException(\"Could not stop with a savepoint job \\\"\" + jobId + \"\\\".\", e);\n        }\n    }\n\n    /** Sends a SavepointTriggerMessage to the job manager in detached mode. */\n    private void stopWithDetachedSavepoint(\n            ClusterClient<?> clusterClient,\n            JobID jobId,\n            boolean advanceToEndOfEventTime,\n            String targetDirectory,\n            SavepointFormatType formatType,\n            Duration clientTimeout)\n            throws FlinkException {\n        logAndSysout(\"Triggering stop-with-savepoint in detached mode for job \" + jobId + '.');\n        try {\n            final String triggerId =\n                    clusterClient\n                            .stopWithDetachedSavepoint(\n                                    jobId, advanceToEndOfEventTime, targetDirectory, formatType)","sourceCodeStart":806,"sourceCodeEnd":842,"githubUrl":"https://github.com/apache/flink/blob/2f3c205e9266cb30240eb7f4fdab15cad629a70f/flink-clients/src/main/java/org/apache/flink/client/cli/CliFrontend.java#L806-L842","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Identify the type in the message and check NestedPrimitiveColumnReader.readPrimitiveValue's switch — is that type root handled?","Avoid the unsupported nested type: cast/restructure the column at the source (flatten the array, change the type) or project it out","Read such columns through a non-nested path or convert the file (e.g. with Spark) to types Flink supports nested","If the type should be supported, open a Flink JIRA (parquet component) — the switch likely needs a new case"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"// Before reading, check nested element types against the supported set\nstatic final Set<LogicalTypeRoot> NESTED_SUPPORTED = Set.of(\n    LogicalTypeRoot.CHAR, LogicalTypeRoot.VARCHAR, LogicalTypeRoot.BOOLEAN,\n    LogicalTypeRoot.BINARY, LogicalTypeRoot.VARBINARY, LogicalTypeRoot.TINYINT,\n    LogicalTypeRoot.SMALLINT, LogicalTypeRoot.INTEGER, LogicalTypeRoot.BIGINT,\n    LogicalTypeRoot.FLOAT, LogicalTypeRoot.DOUBLE,\n    LogicalTypeRoot.TIMESTAMP_WITHOUT_TIME_ZONE, LogicalTypeRoot.TIMESTAMP_WITH_LOCAL_TIME_ZONE);\n\nfor (LogicalType child : ((ArrayType) colType).getChildren()) {\n    if (!NESTED_SUPPORTED.contains(child.getTypeRoot())) skipOrFlatten(colName);\n}","typeGuard":"static boolean nestedTypeSupported(LogicalType t) {\n    return NESTED_SUPPORTED.contains(t.getTypeRoot());\n}","tryCatchPattern":"try {\n    reader.readAndNewVector(...);\n} catch (RuntimeException e) {\n    if (String.valueOf(e.getMessage()).startsWith(\"Unsupported type in the list\")) {\n        // project out the column or convert the file\n    } else throw e;\n}","preventionTips":["Keep nested element types to the well-supported set when writing files for Flink","Add schema-compatibility tests when introducing new logical types to tables","Flatten arrays of exotic scalar types into separate columns at write time"],"tags":["parquet","nested","type-mismatch","unsupported-feature"],"backgroundTag":null,"analyzedSha":"2f3c205e9266cb30240eb7f4fdab15cad629a70f","analyzedAt":"2026-08-14T08:48:24.518Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}