{"record":{"id":"0ea91fdfd41e3888","repo":"apache/druid","slug":"unknown-provider-s-of-s-known-options-s","errorCode":null,"errorMessage":"Unknown provider [%s] of %s, known options [%s]","messagePattern":"Unknown provider \\[(.+?)\\] of (.+?), known options \\[(.+?)\\]","errorType":"validation","errorClass":"ProvisionException","httpStatus":null,"severity":"error","filePath":"processing/src/main/java/org/apache/druid/guice/PolyBind.java","lineNumber":198,"sourceCode":"        implsMap = (Map<String, Provider<T>>) injector.getInstance(Key.get(mapType, key.getAnnotationType()));\n      } else {\n        implsMap = (Map<String, Provider<T>>) injector.getInstance(Key.get(mapType));\n      }\n\n      String implName = props.getProperty(property);\n      if (implName == null) {\n        if (defaultPropertyValue == null) {\n          if (defaultKey == null) {\n            throw new ProvisionException(StringUtils.format(\"Some value must be configured for [%s]\", key));\n          }\n          return injector.getInstance(defaultKey);\n        }\n        implName = defaultPropertyValue;\n      }\n      final Provider<T> provider = implsMap.get(implName);\n\n      if (provider == null) {\n        throw new ProvisionException(\n            StringUtils.format(\"Unknown provider [%s] of %s, known options [%s]\", implName, key, implsMap.keySet())\n        );\n      }\n\n      return provider.get();\n    }\n  }\n}\n","sourceCodeStart":180,"sourceCodeEnd":207,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/guice/PolyBind.java#L180-L207","documentation":"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.","triggerScenarios":"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'.","commonSituations":"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.","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"],"exampleFix":"// before (druid.storage.type=s3 without extension)\ndruid.extensions.loadList=[]\n// after\ndruid.extensions.loadList=[\"druid-s3-extensions\"]","handlingStrategy":"validation","validationCode":"Set<String> known = injector.getInstance(Key.get(new TypeLiteral<Set<Provider<StorageNodeModule>>>() {}, Names.named(\"options\")));\nString impl = properties.getProperty(\"druid.storage.type\");\nif (impl != null && !known.contains(impl)) throw new IllegalStateException(\"Unknown impl \" + impl + \"; known: \" + known);","typeGuard":null,"tryCatchPattern":"try { injector.getInstance(choiceKey); } catch (ProvisionException e) { if (e.getMessage().startsWith(\"Unknown provider\")) log.error(\"Pick from known options: {}\", e.getMessage()); throw e; }","preventionTips":["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"],"tags":["guice","configuration","extensions","polybind","startup"],"backgroundTag":"invalid-enum-value","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}