apache/druid · warning

Skipping deep storage directory kill: storage directory not

Error message

Skipping deep storage directory kill: storage directory not configured

What it means

constructHdfsDeletePath requires druid.storage.storageDirectory to be configured; if storageDirectory is null it logs this warning and returns null, skipping the directory kill. Without a configured base directory the killer cannot safely compute the absolute HDFS path to delete.

Source

Thrown at extensions-core/hdfs-storage/src/main/java/org/apache/druid/storage/hdfs/HdfsDataSegmentKiller.java:202

      return null;
    }
    if (relativePath.charAt(0) == '/') {
      log.warn("Skipping deep storage directory kill: relative path must not be absolute, got [%s]", relativePath);
      return null;
    }
    if (relativePath.indexOf('\\') >= 0) {
      log.warn("Skipping deep storage directory kill: backslash not allowed in path [%s]", relativePath);
      return null;
    }
    for (String segment : StringUtils.splitPreserveAllTokens(relativePath, '/')) {
      if (segment.isEmpty() || "..".equals(segment)) {
        log.warn("Skipping deep storage directory kill: invalid path[%s]", relativePath);
        return null;
      }
    }

    if (storageDirectory == null) {
      log.warn("Skipping deep storage directory kill: storage directory not configured");
      return null;
    }

    final String hdfsRelativePath = relativePath.replace(':', '_');
    final String storageDirectoryString = storageDirectory.toString();
    final String sep = storageDirectoryString.endsWith(Path.SEPARATOR) ? "" : Path.SEPARATOR;
    return new Path(storageDirectoryString + sep + hdfsRelativePath);
  }
}

View on GitHub (pinned to 9b90983fd2)

Solutions

  1. Set druid.storage.storageDirectory in the common runtime properties (e.g. druid.storage.storageDirectory=/druid/segments)
  2. Restart the affected services so the config is picked up
  3. Verify HdfsDataSegmentPusher pushes to the same directory so killer and pusher agree

Example fix

// before (runtime.properties)
druid.storage.type=hdfs
// after
druid.storage.type=hdfs
druid.storage.storageDirectory=/druid/segments
Defensive patterns

Strategy: validation

Validate before calling

String dir = props.getProperty("druid.storage.storageDirectory");
if (dir == null || dir.isEmpty()) { throw new IllegalStateException("druid.storage.storageDirectory must be set when druid.storage.type=hdfs"); }

Prevention

When it happens

Trigger: Running the kill task (or segment kill via coordinator) with the HDFS deep storage extension loaded but druid.storage.storageDirectory unset in the runtime properties.

Common situations: Fresh cluster setups where druid.storage.type=hdfs was set but the storageDirectory property was omitted, or different runtime property files between coordinator and historical nodes.

Understand the failure class

Background: "missing required config value" errors: why libraries refuse to start when a configuration key is empty, unset, or blank — this error's family across 48 libraries.

Related errors


AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07). Data as JSON: /api/errors/9ff7820707b08ec1. Report an issue: GitHub.