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

  1. Choose one of the 'known options' listed in the error and set the property to that value
  2. Load the extension that provides the desired implementation via druid.extensions.loadList in common.runtime.properties
  3. Fix the typo in the property value so it exactly matches a bound implementation name
  4. 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

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


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