{"record":{"id":"08b7a58a041590b7","repo":"apache/druid","slug":"this-druid-indexer-logs-type-s-does-not-support","errorCode":null,"errorMessage":"this druid.indexer.logs.type [%s] does not support managing task payloads yet. You will have to switch to using environment variables","messagePattern":"this druid\\.indexer\\.logs\\.type \\[(.+?)\\] does not support managing task payloads yet\\. You will have to switch to using environment variables","errorType":"exception","errorClass":"org.apache.druid.java.util.common.NotImplementedException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/tasklogs/TaskPayloadManager.java","lineNumber":45,"sourceCode":"import java.io.File;\nimport java.io.IOException;\nimport java.io.InputStream;\n\n/**\n * Something that knows how to push a task payload before it is run to somewhere\n * a ingestion worker will be able to stream the task payload from when trying to run the task.\n */\n@ExtensionPoint\npublic interface TaskPayloadManager\n{\n  /**\n   * Save payload so it can be retrieved later.\n   *\n   * @return inputStream for this taskPayload, if available\n   */\n  default void pushTaskPayload(String taskid, File taskPayloadFile) throws IOException\n  {\n    throw new NotImplementedException(StringUtils.format(\"this druid.indexer.logs.type [%s] does not support managing task payloads yet. You will have to switch to using environment variables\", getClass()));\n  }\n\n  /**\n   * Stream payload for a task.\n   *\n   * @return inputStream for this taskPayload, if available\n   */\n  default Optional<InputStream> streamTaskPayload(String taskid) throws IOException\n  {\n    throw new NotImplementedException(StringUtils.format(\"this druid.indexer.logs.type [%s] does not support managing task payloads yet. You will have to switch to using environment variables\", getClass()));\n  }\n}\n","sourceCodeStart":27,"sourceCodeEnd":58,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/tasklogs/TaskPayloadManager.java#L27-L58","documentation":"TaskPayloadManager.pushTaskPayload is a default interface method that throws NotImplementedException: the configured druid.indexer.logs.type implementation does not support persisting task payloads. Only implementations that override this method (e.g. ones backed by durable storage) can accept payload pushes.","triggerScenarios":"Overlord receiving a POST /druid/indexer/v1/taskPayload/{taskId} (or internal payload push) when druid.indexer.logs.type is set to a legacy/simple implementation such as FileTaskLogs or NoopTaskLogs that never overrode pushTaskPayload.","commonSituations":"Clusters configured with older task-log backends (local file task logs) trying to use the newer task payload API; upgrading the overlord without switching druid.indexer.logs.type to a payload-capable implementation.","solutions":["Switch druid.indexer.logs.type to an implementation that supports payload management (e.g. an implementation overriding pushTaskPayload)","If payload push is not needed, do not call the payload API and rely on task spec submitted via environment","Implement pushTaskPayload in a custom TaskLogs subclass"],"exampleFix":"// before\n-Ddruid.indexer.logs.type=file\n// after (payload-capable backend)\ndruid.indexer.logs.type=customPayloadTaskLogs","handlingStrategy":"fallback","validationCode":"if (!(taskLogs instanceof TaskPayloadManagerWithPayloads)) {\n  logger.warn(\"configured druid.indexer.logs.type does not support payload push\");\n}","typeGuard":"boolean supportsPayloads = taskLogs.getClass().getMethods().stream().noneMatch(m -> m.isDefault() && m.getName().equals(\"pushTaskPayload\"));","tryCatchPattern":"try { taskPayloadManager.pushTaskPayload(taskId, file); } catch (NotImplementedException e) { // submit payload at task submission instead of pushing post-hoc }","preventionTips":["Verify the chosen druid.indexer.logs.type supports payload APIs before enabling payload features","Keep the same TaskLogs backend across overlord and middle managers","Include payload in the initial task spec when the backend is not payload-capable"],"tags":["task-framework","unsupported-operation"],"backgroundTag":"method-not-implemented","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}