{"record":{"id":"fc2adb9a2674929b","repo":"apache/druid","slug":"druid-indexer-runner-javaoptsarray-in-context-of-t","errorCode":null,"errorMessage":"druid.indexer.runner.javaOptsArray in context of task: X must be an array of strings.","messagePattern":"druid\\.indexer\\.runner\\.javaOptsArray in context of task: X must be an array of strings\\.","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"indexing-service/src/main/java/org/apache/druid/indexing/overlord/ForkingTaskRunner.java","lineNumber":287,"sourceCode":"                        Object taskJavaOpts = task.getContextValue(\n                            ForkingTaskRunnerConfig.JAVA_OPTS_PROPERTY\n                        );\n                        if (taskJavaOpts != null) {\n                          command.addAll(new QuotableWhiteSpaceSplitter((String) taskJavaOpts));\n                        }\n\n                        // Override task specific javaOptsArray\n                        try {\n                          List<String> taskJavaOptsArray = jsonMapper.convertValue(\n                              task.getContextValue(ForkingTaskRunnerConfig.JAVA_OPTS_ARRAY_PROPERTY),\n                              new TypeReference<>() {}\n                          );\n                          if (taskJavaOptsArray != null) {\n                            command.addAll(taskJavaOptsArray);\n                          }\n                        }\n                        catch (Exception e) {\n                          throw new IllegalArgumentException(\n                              ForkingTaskRunnerConfig.JAVA_OPTS_ARRAY_PROPERTY\n                              + \" in context of task: \" + task.getId() + \" must be an array of strings.\",\n                              e\n                          );\n                        }\n\n                        for (String propName : props.stringPropertyNames()) {\n                          for (String allowedPrefix : config.getAllowedPrefixes()) {\n                            // See https://github.com/apache/druid/issues/1841\n                            if (propName.startsWith(allowedPrefix)\n                                && !ForkingTaskRunnerConfig.JAVA_OPTS_PROPERTY.equals(propName)\n                                && !ForkingTaskRunnerConfig.JAVA_OPTS_ARRAY_PROPERTY.equals(propName)\n                            ) {\n                              command.addSystemProperty(propName, props.getProperty(propName));\n                            }\n                          }\n                        }\n","sourceCodeStart":269,"sourceCodeEnd":305,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/indexing-service/src/main/java/org/apache/druid/indexing/overlord/ForkingTaskRunner.java#L269-L305","documentation":"ForkingTaskRunner allows a task to override the middle manager's Java options via the 'druid.indexer.runner.javaOptsArray' context key. That context value must be an array of strings; if reading/iterating it fails, the runner wraps the cause in IllegalArgumentException naming the task.","triggerScenarios":"Submitting a task whose context contains druid.indexer.runner.javaOptsArray as a non-array (string, object, number) or an array containing non-string elements; the failure occurs while building the fork command in ForkingTaskRunner.call.","commonSituations":"Copying a single-string javaOpts value into javaOptsArray without splitting; JSON quoting mistakes in the task context; programmatic builders putting non-string objects into context.","solutions":["Set druid.indexer.runner.javaOptsArray to a JSON array of strings, e.g. [\"-Xmx2g\",\"-XX:+UseG1GC\"].","If you want a single string, use druid.indexer.runner.javaOpts instead of javaOptsArray.","Ensure every element is a string; avoid numeric/boolean entries."],"exampleFix":"// before\n\"context\": {\"druid.indexer.runner.javaOptsArray\": \"-Xmx2g -XX:+UseG1GC\"}\n// after\n\"context\": {\"druid.indexer.runner.javaOptsArray\": [\"-Xmx2g\", \"-XX:+UseG1GC\"]}","handlingStrategy":"validation","validationCode":"Object opts = task.getContextValue(\"druid.indexer.runner.javaOptsArray\");\nif (opts != null && !(opts instanceof List\n    && ((List<?>) opts).stream().allMatch(o -> o instanceof String))) {\n  throw new IllegalArgumentException(\"javaOptsArray must be an array of strings\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  submitTask(task);\n} catch (IllegalArgumentException e) {\n  // fix context druid.indexer.runner.javaOptsArray to List<String>\n}","preventionTips":["Use javaOptsArray only with JSON arrays like [\"-Xmx2g\"]; use javaOpts for single strings.","Add a client-side schema check on the task context before submission.","Avoid copying javaOpts values into javaOptsArray without splitting."],"tags":["druid","task-context","config","jvm-opts"],"backgroundTag":"invalid-config-value","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"}