{"record":{"id":"0c00f2650295b2ac","repo":"apache/pulsar","slug":"invalid-metadatastoreconfig-query-parameter-par","errorCode":null,"errorMessage":"Invalid MetadataStoreConfig query parameter '${param}'. Expected key=value","messagePattern":"Invalid MetadataStoreConfig query parameter '(.+?)'\\. Expected key=value","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"pulsar-metadata/src/main/java/org/apache/pulsar/metadata/bookkeeper/MetadataStoreUrl.java","lineNumber":55,"sourceCode":"        String query = metadataStoreUrl.substring(queryStart + 1);\n        if (query.isEmpty()) {\n            return new MetadataStoreUrl(url, Map.of());\n        }\n\n        Map<String, String> configParams = new LinkedHashMap<>();\n        List<String> providerParams = new ArrayList<>();\n        for (String param : query.split(\"&\", -1)) {\n            if (param.isEmpty()) {\n                continue;\n            }\n            int separator = param.indexOf('=');\n            String key = decodeQueryParam(separator > 0 ? param.substring(0, separator) : param);\n            if (!MetadataStoreConfigQueryParams.contains(key)) {\n                providerParams.add(param);\n                continue;\n            }\n            if (separator <= 0) {\n                throw new IllegalArgumentException(\"Invalid MetadataStoreConfig query parameter '\" + param\n                        + \"'. Expected key=value\");\n            }\n\n            String value = decodeQueryParam(param.substring(separator + 1));\n            configParams.put(key, value);\n        }\n\n        if (!providerParams.isEmpty()) {\n            url += \"?\" + String.join(\"&\", providerParams);\n        }\n        return new MetadataStoreUrl(url, Map.copyOf(configParams));\n    }\n\n    private static String removeMetadataStoreScheme(String metadataServiceUri) {\n        String prefix = AbstractMetadataDriver.METADATA_STORE_SCHEME + \":\";\n        if (metadataServiceUri.startsWith(prefix)) {\n            return metadataServiceUri.substring(prefix.length());\n        }","sourceCodeStart":37,"sourceCodeEnd":73,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/bookkeeper/MetadataStoreUrl.java#L37-L73","documentation":"MetadataStoreUrl.parse() splits the metadata store URL into provider params and MetadataStoreConfig params. A query param whose key is a known config key but lacks a '=' separator (i.e., a bare flag like ?sessionTimeoutMillis) cannot be applied and throws IllegalArgumentException 'Expected key=value'.","triggerScenarios":"A known config key appearing in the query string without '=value', e.g. metadata-store-url: zk://host:2181/ledgers?sessionTimeoutMillis — from truncation, typos, or hand-editing URLs.","commonSituations":"Truncated URLs in configs; removing the value but leaving the key and '?key'; mistakes when converting provider-specific params into config params.","solutions":["Append '=value' to the parameter (e.g. sessionTimeoutMillis=30000) or remove the bare key entirely.","Check the full URL wasn't truncated by config tooling or shell escaping.","Verify the param belongs in the config section vs provider params — unknown keys are routed to providerParams and won't trigger this."],"exampleFix":"// before\nzk://zk1:2181/ledgers?sessionTimeoutMillis\n// after\nzk://zk1:2181/ledgers?sessionTimeoutMillis=30000","handlingStrategy":"validation","validationCode":"for (String param : query.split(\"&\")) {\n  int sep = param.indexOf('=');\n  if (sep <= 0 && MetadataStoreConfigQueryParams.contains(decode(param)))\n    throw new IllegalArgumentException(\"param needs key=value: \" + param);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always write query params as key=value","Check URLs aren't truncated by templating/shell escaping","Remove bare keys with no value"],"tags":["configuration","url-parsing","metadata-store","malformed-url"],"backgroundTag":"malformed-url-parameter","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"}