apache/druid · error · ProvisionException
Unknown provider [%s] of %s, known options [%s]
Error message
Unknown provider [%s] of %s, known options [%s]
What it means
PolyBind resolved the choice property to an implementation name, but no provider was bound in the Guice multibinder under that name, so PolyBind.get throws ProvisionException 'Unknown provider [impl] of <key>, known options [...]'. The message lists the valid options.
Source
Thrown at processing/src/main/java/org/apache/druid/guice/PolyBind.java:198
implsMap = (Map<String, Provider<T>>) injector.getInstance(Key.get(mapType, key.getAnnotationType()));
} else {
implsMap = (Map<String, Provider<T>>) injector.getInstance(Key.get(mapType));
}
String implName = props.getProperty(property);
if (implName == null) {
if (defaultPropertyValue == null) {
if (defaultKey == null) {
throw new ProvisionException(StringUtils.format("Some value must be configured for [%s]", key));
}
return injector.getInstance(defaultKey);
}
implName = defaultPropertyValue;
}
final Provider<T> provider = implsMap.get(implName);
if (provider == null) {
throw new ProvisionException(
StringUtils.format("Unknown provider [%s] of %s, known options [%s]", implName, key, implsMap.keySet())
);
}
return provider.get();
}
}
}
View on GitHub (pinned to 9b90983fd2)
Solutions
- Choose one of the 'known options' listed in the error and set the property to that value
- Load the extension that provides the desired implementation via druid.extensions.loadList in common.runtime.properties
- Fix the typo in the property value so it exactly matches a bound implementation name
- Verify the extension module actually binds the implementation via PolyBind.optionBinder in its Guice module
Example fix
// before (druid.storage.type=s3 without extension) druid.extensions.loadList=[] // after druid.extensions.loadList=["druid-s3-extensions"]
Defensive patterns
Strategy: validation
Validate before calling
Set<String> known = injector.getInstance(Key.get(new TypeLiteral<Set<Provider<StorageNodeModule>>>() {}, Names.named("options")));
String impl = properties.getProperty("druid.storage.type");
if (impl != null && !known.contains(impl)) throw new IllegalStateException("Unknown impl " + impl + "; known: " + known); Try / catch
try { injector.getInstance(choiceKey); } catch (ProvisionException e) { if (e.getMessage().startsWith("Unknown provider")) log.error("Pick from known options: {}", e.getMessage()); throw e; } Prevention
- Whenever you set a choice property to a non-default impl, also add the providing extension to druid.extensions.loadList
- Cross-check property values against the 'known options' list in the error message
- Keep extension and config changes in the same deployment review
When it happens
Trigger: props.getProperty(property) returns an implName that is absent from implsMap (built from the Guice multibinder of providers for that key) — e.g. property set to 's3' but the s3-druid extension is not loaded so no provider bound under 's3'.
Common situations: Setting druid.storage.type=s3 or druid.emitter=myEmitter without loading the corresponding extension (extensions-load-list missing the extension); typo in the impl name; extension jar present but not listed in java.io.tmpdir extensions directory.
Understand the failure class
Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.
Related errors
- Some value must be configured for [%s]
- %s - %s
- Double dot in property: %s
- Dot at the end of property: %s
- JsonConfigurator requires default classes to have zero-arg c
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/0ea91fdfd41e3888.
Report an issue: GitHub.