apache/druid · error · DruidException
'druid.coordinator.kill.period
Error message
'druid.coordinator.kill.period'[%s] must be greater than or equal to 'druid.coordinator.period.indexingPeriod'[%s]
What it means
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.
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
Example fix
// before (runtime.properties) druid.coordinator.kill.period=PT5M druid.coordinator.period.indexingPeriod=PT30M // after druid.coordinator.kill.period=PT30M druid.coordinator.period.indexingPeriod=PT30M
Defensive patterns
Strategy: validation
Validate before calling
final Period killPeriod = Period.parse(props.getProperty("druid.coordinator.kill.period", "P1D"));
final Period indexingPeriod = Period.parse(props.getProperty("druid.coordinator.period.indexingPeriod", "PT30M"));
if (killPeriod.toStandardDuration().getMillis() < indexingPeriod.toStandardDuration().getMillis()) {
throw new IllegalArgumentException("druid.coordinator.kill.period must be >= druid.coordinator.period.indexingPeriod");
} Try / catch
try {
coordinator.start();
} catch (WebApplicationException | IllegalArgumentException e) {
if (String.valueOf(e.getMessage()).contains("druid.coordinator.kill.period")) {
// correct runtime.properties and restart
}
} Prevention
- 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
When it happens
Trigger: Starting the Coordinator with druid.coordinator.kill.period set to a duration strictly less than druid.coordinator.period.indexingPeriod (default 30m / PT30M).
Common situations: 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.
Understand the failure class
Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.
Related errors
- 'druid.coordinator.kill.maxSegments
- 'druid.coordinator.kill.
- INVALID_INPUT
- At least one of the druid.enablePlaintextPort or…
- At least one task runner must be enabled
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/a4d21e4b57ed50ec.
Report an issue: GitHub.
Appendix: source
Thrown at server/src/main/java/org/apache/druid/server/coordinator/config/DruidCoordinatorConfig.java:104
public HttpLoadQueuePeonConfig getHttpLoadQueuePeonConfig()
{
return httpLoadQueuePeonConfig;
}
private void validateKillConfigs()
{
validateKillConfig(killConfigs.auditLogs(), "audit");
validateKillConfig(killConfigs.compactionConfigs(), "compaction");
validateKillConfig(killConfigs.datasources(), "datasource");
validateKillConfig(killConfigs.rules(), "rule");
validateKillConfig(killConfigs.supervisors(), "supervisor");
validateKillConfig(killConfigs.segmentSchemas(), "segmentSchema");
// Validate config for killing unused segments
final KillUnusedSegmentsConfig killUnusedConfig
= killConfigs.unusedSegments(getCoordinatorIndexingPeriod());
if (killUnusedConfig.getCleanupPeriod().getMillis() < getCoordinatorIndexingPeriod().getMillis()) {
throw newInvalidInputExceptionForOperator(
"'druid.coordinator.kill.period'[%s] must be greater than or equal to"
+ " 'druid.coordinator.period.indexingPeriod'[%s]",
killUnusedConfig.getCleanupPeriod(), getCoordinatorIndexingPeriod()
);
}
if (killUnusedConfig.getMaxSegments() < 0) {
throw newInvalidInputExceptionForOperator(
"'druid.coordinator.kill.maxSegments'[%s] must be a positive integer.",
killUnusedConfig.getMaxSegments()
);
}
}
private void validateKillConfig(MetadataCleanupConfig config, String propertyPrefix)
{
if (!config.isCleanupEnabled()) {
// Do not perform validation if cleanup is disabled
return;View on GitHub (pinned to 9b90983fd2)