{"record":{"id":"5df898a4c9012412","repo":"apache/iceberg","slug":"unknown-task-type","errorCode":null,"errorMessage":"Unknown task type: ","messagePattern":"Unknown task type: ","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/org/apache/iceberg/ScanTaskParser.java","lineNumber":58,"sourceCode":"    TaskType(String value) {\n      this.value = value;\n    }\n\n    public static TaskType fromTypeName(String value) {\n      Preconditions.checkArgument(\n          !Strings.isNullOrEmpty(value), \"Invalid task type name: null or empty\");\n      if (FILE_SCAN_TASK.typeName().equalsIgnoreCase(value)) {\n        return FILE_SCAN_TASK;\n      } else if (DATA_TASK.typeName().equalsIgnoreCase(value)) {\n        return DATA_TASK;\n      } else if (FILES_TABLE_TASK.typeName().equalsIgnoreCase(value)) {\n        return FILES_TABLE_TASK;\n      } else if (ALL_MANIFESTS_TABLE_TASK.typeName().equalsIgnoreCase(value)) {\n        return ALL_MANIFESTS_TABLE_TASK;\n      } else if (MANIFEST_ENTRIES_TABLE_TASK.typeName().equalsIgnoreCase(value)) {\n        return MANIFEST_ENTRIES_TABLE_TASK;\n      } else {\n        throw new IllegalArgumentException(\"Unknown task type: \" + value);\n      }\n    }\n\n    public String typeName() {\n      return value;\n    }\n  }\n\n  private ScanTaskParser() {}\n\n  public static String toJson(FileScanTask fileScanTask) {\n    Preconditions.checkArgument(fileScanTask != null, \"Invalid scan task: null\");\n    return JsonUtil.generate(generator -> toJson(fileScanTask, generator), false);\n  }\n\n  public static FileScanTask fromJson(String json, boolean caseSensitive) {\n    Preconditions.checkArgument(json != null, \"Invalid JSON string for scan task: null\");\n    return JsonUtil.parse(json, node -> fromJson(node, caseSensitive));","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/core/src/main/java/org/apache/iceberg/ScanTaskParser.java#L40-L76","documentation":"ScanTaskParser.TaskType.fromTypeName maps a JSON 'task-type' string to the internal TaskType enum (file-scan-task, data-task, files-table-task, all-manifests-table-task, manifest-entries-task). When the string does not case-insensitively match any known type name, it throws this IllegalArgumentException. It guards against deserializing scan task JSON written by a newer or incompatible Iceberg version.","triggerScenarios":"Calling ScanTaskParser.fromJson(String, boolean) on JSON whose 'task-type' field holds a value outside the five known names (typo, unknown type from a newer Iceberg release, or a custom ScanTask serialized by another writer).","commonSituations":"Rolling upgrades where tasks serialized by a newer Iceberg version (with new task types) are read by an older client; hand-edited or copy-pasted task JSON; metadata/metadata-log tooling passing raw strings into the parser.","solutions":["Check the 'task-type' value in the JSON against the known names: file-scan-task, data-task, files-table-task, all-manifests-table-task, manifest-entries-task","Upgrade the Iceberg version on the reading side to match or exceed the version that wrote the JSON","Fix typos in the task-type string (matching is case-insensitive, so casing alone is safe)"],"exampleFix":"// before\nFileScanTask task = ScanTaskParser.fromJson(json, true); // json has \"task-type\": \"position-delete-scan-task\"\n// after\nString type = JsonUtil.getStringOrNull(\"task-type\", node);\nif (type != null && !List.of(\"file-scan-task\",\"data-task\",\"files-table-task\",\"all-manifests-table-task\",\"manifest-entries-task\").contains(type.toLowerCase(Locale.ROOT))) {\n  throw new IllegalStateException(\"Unsupported task type in payload: \" + type + \"; upgrade Iceberg\");\n}\nFileScanTask task = ScanTaskParser.fromJson(json, true);","handlingStrategy":"validation","validationCode":"private static final Set<String> KNOWN = Set.of(\"file-scan-task\",\"data-task\",\"files-table-task\",\"all-manifests-table-task\",\"manifest-entries-task\");\nString type = node.has(\"task-type\") ? node.get(\"task-type\").asText() : \"file-scan-task\";\nif (!KNOWN.contains(type.toLowerCase(Locale.ROOT))) throw new IllegalArgumentException(\"Unsupported task-type: \" + type);","typeGuard":"static boolean isKnownTaskType(String s) {\n  return s != null && (s.equalsIgnoreCase(\"file-scan-task\") || s.equalsIgnoreCase(\"data-task\") || s.equalsIgnoreCase(\"files-table-task\") || s.equalsIgnoreCase(\"all-manifests-table-task\") || s.equalsIgnoreCase(\"manifest-entries-task\"));\n}","tryCatchPattern":"try {\n  return ScanTaskParser.fromJson(json, caseSensitive);\n} catch (IllegalArgumentException e) {\n  if (e.getMessage().startsWith(\"Unknown task type\")) { log.warn(\"Skipping task JSON from newer Iceberg: {}\", e.getMessage()); return null; }\n  throw e;\n}","preventionTips":["Never hand-write task-type strings; round-trip JSON through the same Iceberg version that parses it","Align Iceberg versions across writer and reader before exchanging task JSON","Treat task-type matching as case-insensitive but value-exact"],"tags":["json","deserialization","parsing"],"backgroundTag":"invalid-enum-value","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}