{"record":{"id":"8d4329666dae205c","repo":"apache/pulsar","slug":"key-already-exists-in-the-dynamicconfigurationm","errorCode":null,"errorMessage":"${key} already exists in the dynamicConfigurationMap","messagePattern":"(.+?) already exists in the dynamicConfigurationMap","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"pulsar-broker/src/main/java/org/apache/pulsar/broker/service/BrokerService.java","lineNumber":3758,"sourceCode":"    }\n\n    private void addDynamicConfigValidator(String key, Predicate<String> validator) {\n        validateConfigKey(key);\n        dynamicConfigurationMap.get(key).validator = validator;\n    }\n\n    private void validateConfigKey(String key) {\n        if (!dynamicConfigurationMap.containsKey(key)) {\n            throw new IllegalArgumentException(key + \" doesn't exits in the dynamicConfigurationMap\");\n        }\n    }\n\n    /**\n     * Allows the third-party plugin to register a custom dynamic configuration.\n     */\n    public void registerCustomDynamicConfiguration(String key, Predicate<String> validator) {\n        if (dynamicConfigurationMap.containsKey(key)) {\n            throw new IllegalArgumentException(key + \" already exists in the dynamicConfigurationMap\");\n        }\n        ConfigField configField = ConfigField.newCustomConfigField(null);\n        configField.validator = validator;\n        dynamicConfigurationMap.put(key, configField);\n    }\n\n    private void createDynamicConfigPathIfNotExist() {\n        try {\n            Optional<Map<String, String>> configCache =\n                    pulsar().getPulsarResources().getDynamicConfigResources().getDynamicConfiguration();\n\n            // create dynamic-config if not exist.\n            if (!configCache.isPresent()) {\n                pulsar().getPulsarResources().getDynamicConfigResources()\n                        .setDynamicConfigurationWithCreate(n -> new HashMap<>());\n            }\n        } catch (Exception e) {\n            log.warn().exception(e).log(\"Failed to read dynamic broker configuration\");","sourceCodeStart":3740,"sourceCodeEnd":3776,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/BrokerService.java#L3740-L3776","documentation":"registerCustomDynamicConfiguration allows broker plugins to register custom dynamic configuration keys. It throws IllegalArgumentException if the key is already present in dynamicConfigurationMap, to prevent a plugin from silently overriding an existing (built-in or previously registered) configuration entry.","triggerScenarios":"Calling BrokerService.registerCustomDynamicConfiguration(key, validator) with a key that already exists — either a built-in Pulsar dynamic config key or one registered by another plugin or a prior registration call.","commonSituations":"Plugin hot-reload/re-initialization code that registers the same config key twice; a custom plugin using a config key name that collides with a Pulsar built-in dynamic configuration; two plugins registering the same key.","solutions":["Choose a unique, namespaced key for your custom configuration (e.g. prefix with your plugin name)","Check dynamicConfigurationMap.containsKey(key) (or track your own registry) before registering","Guard the registration with a first-run/one-time flag so reloads don't re-register","Catch IllegalArgumentException and log/skip instead of failing broker startup"],"exampleFix":"// before\nbrokerService.registerCustomDynamicConfiguration(\"myConfig\", validator);\n// after\nif (!brokerService.getDynamicConfigurationMap().containsKey(\"myplugin_myConfig\")) {\n    brokerService.registerCustomDynamicConfiguration(\"myplugin_myConfig\", validator);\n}","handlingStrategy":"validation","validationCode":"if (!brokerService.getDynamicConfigurationMap().containsKey(key)) {\n    brokerService.registerCustomDynamicConfiguration(key, validator);\n}","typeGuard":null,"tryCatchPattern":"try {\n    brokerService.registerCustomDynamicConfiguration(key, validator);\n} catch (IllegalArgumentException e) {\n    log.warn(\"Custom config key {} already registered\", key, e);\n}","preventionTips":["Namespace custom config keys with a plugin-specific prefix","Track registrations in plugin code to avoid double-registration on reload","Review Pulsar's built-in dynamic configuration list before picking key names"],"tags":["java","broker","configuration","plugin","duplicate-key"],"backgroundTag":"duplicate-configuration-key","analyzedSha":"820761864ed8e2a7d2e52dd9763ad2ae117c1395","analyzedAt":"2026-09-06T00:14:20.138Z","contentChangedAt":"2026-09-06T00:14:20.138Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}