{"record":{"id":"d6cdecaa90b97fee","repo":"apache/druid","slug":"druid-coordinator-kill-maxsegments-s-must-be-a","errorCode":null,"errorMessage":"'druid.coordinator.kill.maxSegments'[%s] must be a positive integer.","messagePattern":"'druid\\.coordinator\\.kill\\.maxSegments'\\[(.+?)\\] must be a positive integer\\.","errorType":"validation","errorClass":"DruidException","httpStatus":null,"severity":"error","filePath":"server/src/main/java/org/apache/druid/server/coordinator/config/DruidCoordinatorConfig.java","lineNumber":111,"sourceCode":"    validateKillConfig(killConfigs.auditLogs(), \"audit\");\n    validateKillConfig(killConfigs.compactionConfigs(), \"compaction\");\n    validateKillConfig(killConfigs.datasources(), \"datasource\");\n    validateKillConfig(killConfigs.rules(), \"rule\");\n    validateKillConfig(killConfigs.supervisors(), \"supervisor\");\n    validateKillConfig(killConfigs.segmentSchemas(), \"segmentSchema\");\n\n    // Validate config for killing unused segments\n    final KillUnusedSegmentsConfig killUnusedConfig\n        = killConfigs.unusedSegments(getCoordinatorIndexingPeriod());\n    if (killUnusedConfig.getCleanupPeriod().getMillis() < getCoordinatorIndexingPeriod().getMillis()) {\n      throw newInvalidInputExceptionForOperator(\n          \"'druid.coordinator.kill.period'[%s] must be greater than or equal to\"\n          + \" 'druid.coordinator.period.indexingPeriod'[%s]\",\n          killUnusedConfig.getCleanupPeriod(), getCoordinatorIndexingPeriod()\n      );\n    }\n    if (killUnusedConfig.getMaxSegments() < 0) {\n      throw newInvalidInputExceptionForOperator(\n          \"'druid.coordinator.kill.maxSegments'[%s] must be a positive integer.\",\n          killUnusedConfig.getMaxSegments()\n      );\n    }\n  }\n\n  private void validateKillConfig(MetadataCleanupConfig config, String propertyPrefix)\n  {\n    if (!config.isCleanupEnabled()) {\n      // Do not perform validation if cleanup is disabled\n      return;\n    }\n\n    final Duration metadataManagementPeriod = getCoordinatorMetadataStoreManagementPeriod();\n    final Duration period = config.getCleanupPeriod();\n    if (period == null || period.getMillis() < metadataManagementPeriod.getMillis()) {\n      throw newInvalidInputExceptionForOperator(\n          \"'druid.coordinator.kill.%s.period'[%s] must be greater than\"","sourceCodeStart":93,"sourceCodeEnd":129,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/server/src/main/java/org/apache/druid/server/coordinator/config/DruidCoordinatorConfig.java#L93-L129","documentation":"validateKillConfigs() requires druid.coordinator.kill.maxSegments to be a non-negative value, throwing this invalid-input error at Coordinator startup when it is negative. The property caps how many unused segments are deleted per kill-task run, so a negative cap is nonsensical.","triggerScenarios":"Coordinator startup when killUnusedConfig.getMaxSegments() < 0, i.e. druid.coordinator.kill.maxSegments (or the legacy druid.coordinator.kill.maxSegments property feeding KillUnusedSegmentsConfig) is set to a negative integer.","commonSituations":"Typo like -100 instead of 100, or an operator disabling killing by supplying a negative number expecting it to be treated as 'disabled' (use a very large value or the dedicated kill switch instead).","solutions":["Set druid.coordinator.kill.maxSegments to a positive integer (e.g. 100)","To effectively disable segment killing, set a very large maxSegments and/or set druid.coordinator.kill.period to a very large value instead of a negative number","Restart the Coordinator once the property is corrected"],"exampleFix":"// before\ndruid.coordinator.kill.maxSegments=-1\n// after\ndruid.coordinator.kill.maxSegments=100","handlingStrategy":"validation","validationCode":"final int maxSegments = Integer.parseInt(props.getProperty(\"druid.coordinator.kill.maxSegments\", \"100\"));\nif (maxSegments < 0) {\n  throw new IllegalArgumentException(\"druid.coordinator.kill.maxSegments must be a positive integer\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  coordinator.start();\n} catch (Exception e) {\n  if (String.valueOf(e.getMessage()).contains(\"kill.maxSegments\")) {\n    // set a positive integer and restart\n  }\n}","preventionTips":["Never use negative values to 'disable' killing; use large values or disable via period instead","Add pre-deploy config validation for kill.* properties","Keep defaults (100) unless there is a measured need to change","Sanitize numeric properties with a linting script before rollout"],"tags":["coordinator","configuration","validation","startup"],"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"}