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
- Verify the extension exists: `ls <druid.extensions.directory>/<name>` must show a directory with jars
- Correct the spelling of the entry in druid.extensions.loadList
- Install/unpack the extension into the extensions directory, or use an absolute path in loadList
- 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
- Automate extension installation so loadList entries always match installed dirs
- After upgrades, diff loadList against `ls extensions/`
- Use absolute paths only when the path is provisioned on every host
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
- Root extensions directory [%s] is not a directory!?
- Unknown provider [%s] of %s, known options [%s]
- The gRPC query server requires either a Basic or Anonymous a
- Metric [%s] not whitelisted.
- Can't load TrustStore. Truststore path or password is not se
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/eca9d556931d8f85.
Report an issue: GitHub.