apache/druid · error · ISE

Extension [%s] specified in "druid.extensions.loadList" didn

Error message

Extension [%s] specified in "druid.extensions.loadList" didn't exist!?

What it means

For each name in druid.extensions.loadList, ExtensionsLoader resolves an absolute path or a subdirectory of the root extensions dir. This ISE is thrown when a listed extension's directory does not exist or is not a directory, i.e. the extension is not installed where Druid expects it.

Source

Thrown at processing/src/main/java/org/apache/druid/guice/ExtensionsLoader.java:214

      final LinkedHashSet<String> validExtensionsToLoad = new LinkedHashSet<>(toLoad);
      if (validExtensionsToLoad.remove("druid-multi-stage-query")) {
        log.warn(
            "Skipping extension[druid-multi-stage-query] as it is now a core"
            + " capability of Druid. Please remove this extension from your"
            + " configs as it will cause services to fail in future Druid versions."
        );
      }

      int i = 0;
      extensionsToLoad = new File[validExtensionsToLoad.size()];
      for (final String extensionName : validExtensionsToLoad) {
        File extensionDir = new File(extensionName);
        if (!extensionDir.isAbsolute()) {
          extensionDir = new File(rootExtensionsDir, extensionName);
        }

        if (!extensionDir.isDirectory()) {
          throw new ISE(
              "Extension [%s] specified in \"druid.extensions.loadList\" didn't exist!?",
              extensionDir.getAbsolutePath()
          );
        }
        extensionsToLoad[i++] = extensionDir;
      }
    }
    synchronized (this) {
      extensionFilesToLoad = extensionsToLoad == null ? new File[]{} : extensionsToLoad;
    }
  }

  public File[] getExtensionFilesToLoad()
  {
    synchronized (this) {
      if (extensionFilesToLoad == null) {
        initializeExtensionFilesToLoad();
      }

View on GitHub (pinned to 9b90983fd2)

Solutions

  1. Verify the extension exists: `ls <druid.extensions.directory>/<name>` must show a directory with jars
  2. Correct the spelling of the entry in druid.extensions.loadList
  3. Install/unpack the extension into the extensions directory, or use an absolute path in loadList
  4. Remove the entry from loadList if the extension is not actually needed

Example fix

// before
-Ddruid.extensions.loadList="[\"postgresql-metadata-storage\", \"kafak-ingestion\"]"
// after
-Ddruid.extensions.loadList="[\"postgresql-metadata-storage\", \"kafka-ingestion\"]"
Defensive patterns

Strategy: validation

Validate before calling

for (String name : loadList) {
  File d = new File(name).isAbsolute() ? new File(name) : new File(rootExtDir, name);
  if (!d.isDirectory()) throw new IllegalStateException("Missing extension: " + d);
}

Try / catch

try { startDruid(); } catch (ISE e) {
  if (e.getMessage().contains("didn't exist")) { installMissingExtension(e); }
  throw e;
}

Prevention

When it happens

Trigger: druid.extensions.loadList contains an entry whose directory is absent under druid.extensions.directory (or whose absolute path does not exist / is not a directory), when starting any Druid process.

Common situations: Extension never unpacked into the extensions dir; typo in the loadList name; extension directory renamed after upgrade; loadList copied from another cluster with different installed extensions.

Understand the failure class

Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.

Related errors


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