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

  1. Set druid.coordinator.kill.period to a value >= druid.coordinator.period.indexingPeriod (e.g. PT30M or larger, commonly P1D)
  2. Or lower druid.coordinator.period.indexingPeriod so it does not exceed the desired kill period
  3. 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

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


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)