{"record":{"id":"0e30c349e3b0f408","repo":"apache/pulsar","slug":"no-extension-is-found-for-extension-name-extens","errorCode":null,"errorMessage":"No extension is found for extension name `${extensionName}`. Available extensions are : ${definitions.extensions()}","messagePattern":"No extension is found for extension name `(.+?)`\\. Available extensions are : (.+?)","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"pulsar-proxy/src/main/java/org/apache/pulsar/proxy/extensions/ProxyExtensions.java","lineNumber":66,"sourceCode":"     *\n     * @param conf the pulsar broker service configuration\n     * @return the collection of extensions\n     */\n    public static ProxyExtensions load(ProxyConfiguration conf) throws IOException {\n        if (conf.getProxyExtensions().isEmpty()) {\n            return new ProxyExtensions(Collections.emptyMap());\n        }\n        ExtensionsDefinitions definitions =\n                ProxyExtensionsUtils.searchForExtensions(\n                        conf.getProxyExtensionsDirectory(), conf.getNarExtractionDirectory());\n\n        ImmutableMap.Builder<String, ProxyExtensionWithClassLoader> extensionsBuilder = ImmutableMap.builder();\n\n        conf.getProxyExtensions().forEach(extensionName -> {\n\n            ProxyExtensionMetadata definition = definitions.extensions().get(extensionName);\n            if (null == definition) {\n                throw new RuntimeException(\"No extension is found for extension name `\" + extensionName\n                    + \"`. Available extensions are : \" + definitions.extensions());\n            }\n\n            ProxyExtensionWithClassLoader extension;\n            try {\n                extension = ProxyExtensionsUtils.load(definition, conf.getNarExtractionDirectory());\n            } catch (IOException e) {\n                log.error().attr(\"extension\", extensionName).exception(e)\n                        .log(\"Failed to load the extension\");\n                throw new RuntimeException(\"Failed to load the extension for extension name `\" + extensionName + \"`\");\n            }\n\n            if (!extension.accept(extensionName)) {\n                extension.close();\n                log.error().attr(\"extension\", extensionName)\n                        .log(\"Malformed extension found\");\n                throw new RuntimeException(\"Malformed extension found for extension name `\" + extensionName + \"`\");\n            }","sourceCodeStart":48,"sourceCodeEnd":84,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/pulsar-proxy/src/main/java/org/apache/pulsar/proxy/extensions/ProxyExtensions.java#L48-L84","documentation":"ProxyExtensions.load resolves each extension name from the proxyExtensions configuration against the set of NAR extension definitions discovered (via ServiceLoader from the extensions directory). If a configured name has no matching definition, a RuntimeException listing the available extensions is thrown at proxy startup. This is a fail-fast configuration validation: the proxy cannot enable an extension whose NAR is not installed.","triggerScenarios":"Starting the Pulsar proxy with proxyExtensions set to a name not present in the extensions directory — e.g. typo'd name, NAR file missing from the extensions dir, wrong NAR deployed, or case mismatch.","commonSituations":"Operator copies config from a tutorial but never drops the extension NAR into $PULSAR_HOME/proxyextensions (or the configured extensionsDirectory); extension renamed between versions; extension NAR failed to load/parse so it is absent from definitions; deploying only to broker but enabling on proxy.","solutions":["Compare the configured name against the 'Available extensions' list in the message and fix the typo/case.","Install the extension NAR into the proxy extensions directory ($PULSAR_HOME/proxyextensions or conf proxyExtensionsDirectory) and restart.","Remove the unknown name from proxyExtensions in proxy.conf / proxyconfig if the extension is not needed.","Verify the NAR is valid and matches this Pulsar version (an unloadable NAR will not appear in definitions)."],"exampleFix":"# before (proxy.conf)\nproxyExtensions=obfs4proxy\n# after — name must match an installed NAR\nproxyExtensions=authentication\n# and ensure the NAR exists:\n# cp pulsar-proxy-authentication.nar $PULSAR_HOME/proxyextensions/","handlingStrategy":"validation","validationCode":"java.io.File extDir = new java.io.File(conf.getProxyExtensionsDirectory());\nSet<String> available = new HashSet<>();\nfor (java.io.File f : extDir.listFiles((d, n) -> n.endsWith(\".nar\"))) {\n    available.add(f.getName().replaceFirst(\"\\\\.nar$\", \"\"));\n}\nfor (String ext : conf.getProxyExtensions()) {\n    if (!available.stream().anyMatch(a -> a.contains(ext))) {\n        throw new IllegalArgumentException(\"Extension \" + ext + \" not installed in \" + extDir);\n    }\n}","typeGuard":null,"tryCatchPattern":"try {\n    proxyExtensions.load(conf);\n} catch (RuntimeException e) {\n    if (e.getMessage().startsWith(\"No extension is found\")) {\n        log.error(\"Fix proxyExtensions config or install the NAR: {}\", e.getMessage());\n    }\n    throw e; // startup fails fast by design\n}","preventionTips":["Keep proxyExtensions names exactly matching installed NAR definitions (check the startup log's available list).","Deploy extension NARs to the proxy extensions directory on every proxy host (config management/Ansible/K8s init).","After Pulsar upgrades, verify extension names/NAR versions still match.","Only enable extensions whose NAR is actually bundled in your deployment images."],"tags":["proxy","configuration","extension","nar","startup"],"backgroundTag":"proxy-extension-not-found","analyzedSha":"820761864ed8e2a7d2e52dd9763ad2ae117c1395","analyzedAt":"2026-09-06T00:14:20.138Z","contentChangedAt":"2026-09-06T00:14:20.138Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}