{"record":{"id":"a4d21e4b57ed50ec","repo":"apache/druid","slug":"druid-coordinator-kill-period-s-must-be-greate","errorCode":null,"errorMessage":"'druid.coordinator.kill.period'[%s] must be greater than or equal to 'druid.coordinator.period.indexingPeriod'[%s]","messagePattern":"'druid\\.coordinator\\.kill\\.period'\\[(.+?)\\] must be greater than or equal to 'druid\\.coordinator\\.period\\.indexingPeriod'\\[(.+?)\\]","errorType":"validation","errorClass":"DruidException","httpStatus":null,"severity":"error","filePath":"server/src/main/java/org/apache/druid/server/coordinator/config/DruidCoordinatorConfig.java","lineNumber":104,"sourceCode":"  public HttpLoadQueuePeonConfig getHttpLoadQueuePeonConfig()\n  {\n    return httpLoadQueuePeonConfig;\n  }\n\n  private void validateKillConfigs()\n  {\n    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;","sourceCodeStart":86,"sourceCodeEnd":122,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/server/src/main/java/org/apache/druid/server/coordinator/config/DruidCoordinatorConfig.java#L86-L122","documentation":"At coordinator startup, DruidCoordinatorConfig.validateKillConfigs() checks that the kill-unused-segments cleanup period (druid.coordinator.kill.period) is not shorter than the main coordinator indexing period (druid.coordinator.period.indexingPeriod). Killing runs inside the indexing-period duty cycle, so a smaller kill period is meaningless and rejected as invalid operator input.","triggerScenarios":"Starting the Coordinator with druid.coordinator.kill.period set to a duration strictly less than druid.coordinator.period.indexingPeriod (default 30m / PT30M).","commonSituations":"Operators tuning kill frequency after upgrading (kill config moved under druid.coordinator.kill.* KillUnusedSegmentsConfig), copying configs between clusters where indexingPeriod was customized, or setting kill.period=PT5M while leaving the default indexingPeriod.","solutions":["Set druid.coordinator.kill.period to a value >= druid.coordinator.period.indexingPeriod (e.g. PT30M or larger, commonly P1D)","Or lower druid.coordinator.period.indexingPeriod so it does not exceed the desired kill period","Restart the Coordinator after fixing the properties in runtime.properties"],"exampleFix":"// before (runtime.properties)\ndruid.coordinator.kill.period=PT5M\ndruid.coordinator.period.indexingPeriod=PT30M\n// after\ndruid.coordinator.kill.period=PT30M\ndruid.coordinator.period.indexingPeriod=PT30M","handlingStrategy":"validation","validationCode":"final Period killPeriod = Period.parse(props.getProperty(\"druid.coordinator.kill.period\", \"P1D\"));\nfinal Period indexingPeriod = Period.parse(props.getProperty(\"druid.coordinator.period.indexingPeriod\", \"PT30M\"));\nif (killPeriod.toStandardDuration().getMillis() < indexingPeriod.toStandardDuration().getMillis()) {\n  throw new IllegalArgumentException(\"druid.coordinator.kill.period must be >= druid.coordinator.period.indexingPeriod\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  coordinator.start();\n} catch (WebApplicationException | IllegalArgumentException e) {\n  if (String.valueOf(e.getMessage()).contains(\"druid.coordinator.kill.period\")) {\n    // correct runtime.properties and restart\n  }\n}","preventionTips":["Validate kill.period >= period.indexingPeriod in config review/CI before deploy","Use ISO-8601 durations (PT30M, P1D) consistently in runtime.properties","Remember kill runs inside the indexing-period duty cycle; never set it shorter","Document customized indexingPeriod values per cluster to avoid copy-paste regressions"],"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"}