{"record":{"id":"997303eebced9522","repo":"apache/pulsar","slug":"implementation-does-not-comply-with-org-apache-pul","errorCode":null,"errorMessage":"Implementation does not comply with org.apache.pulsar.metadata.api.extended.MetadataStoreExtended","messagePattern":"Implementation does not comply with org\\.apache\\.pulsar\\.metadata\\.api\\.extended\\.MetadataStoreExtended","errorType":"exception","errorClass":"MetadataStoreException.InvalidImplementationException","httpStatus":null,"severity":"error","filePath":"pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/MetadataStoreFactoryImpl.java","lineNumber":51,"sourceCode":"import org.apache.pulsar.metadata.api.extended.MetadataStoreExtended;\nimport org.apache.pulsar.metadata.impl.oxia.OxiaMetadataStoreProvider;\n\n@CustomLog\npublic class MetadataStoreFactoryImpl {\n\n    public static final String METADATASTORE_PROVIDERS_PROPERTY = \"pulsar.metadatastore.providers\";\n\n    public static MetadataStore create(String metadataURL, MetadataStoreConfig metadataStoreConfig) throws\n            MetadataStoreException {\n        return newInstance(metadataURL, metadataStoreConfig, false);\n    }\n\n    public static MetadataStoreExtended createExtended(String metadataURL, MetadataStoreConfig metadataStoreConfig)\n            throws\n            MetadataStoreException {\n        MetadataStore store = MetadataStoreFactoryImpl.newInstance(metadataURL, metadataStoreConfig, true);\n        if (!(store instanceof MetadataStoreExtended)) {\n            throw new MetadataStoreException.InvalidImplementationException(\n                    \"Implementation does not comply with \" + MetadataStoreExtended.class.getName());\n        }\n\n        return (MetadataStoreExtended) store;\n    }\n\n    private static MetadataStore newInstance(String metadataURL, MetadataStoreConfig metadataStoreConfig,\n                                             boolean enableSessionWatcher)\n            throws MetadataStoreException {\n        MetadataStoreProvider provider = findProvider(metadataURL);\n        return provider.create(metadataURL, metadataStoreConfig, enableSessionWatcher);\n    }\n\n    @SuppressWarnings(\"auxiliaryclass\")\n    static Map<String, MetadataStoreProvider> loadProviders() {\n        Map<String, MetadataStoreProvider> providers = new HashMap<>();\n        providers.put(MEMORY_SCHEME_IDENTIFIER, new MemoryMetadataStoreProvider());\n        providers.put(ROCKSDB_SCHEME_IDENTIFIER, new RocksdbMetadataStoreProvider());","sourceCodeStart":33,"sourceCodeEnd":69,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/MetadataStoreFactoryImpl.java#L33-L69","documentation":"MetadataStoreFactoryImpl.createExtended() instantiates a store from a metadata URL and requires the result to implement MetadataStoreExtended (which exposes extended APIs like metadata caches/coordination). If the provider's implementation only implements the basic MetadataStore interface, it throws MetadataStoreException.InvalidImplementationException with this message.","triggerScenarios":"Calling MetadataStoreFactoryImpl.createExtended(\"...\", config) with a URL scheme whose provider class implements MetadataStore but not MetadataStoreExtended.","commonSituations":"Custom or minimal metadata store providers registered via ServiceLoader that never implemented the extended interface; plugging a legacy provider into code that requires extended APIs (e.g., Pulsar broker startup with a custom metadata URL).","solutions":["Use a metadata URL scheme backed by a MetadataStoreExtended implementation (zk:, oxia:, rocksdb:, memory:)","Upgrade or fix the custom provider to implement org.apache.pulsar.metadata.api.extended.MetadataStoreExtended","If only basic MetadataStore is needed, call MetadataStoreFactory.create() instead of createExtended()"],"exampleFix":"// before\nMetadataStoreExtended store = MetadataStoreFactoryImpl.createExtended(\"mem://\", cfg); // provider not extended\n// after\nMetadataStoreExtended store = MetadataStoreFactoryImpl.createExtended(\"rocksdb:///data/metadata\", cfg);","handlingStrategy":"type-guard","validationCode":"// Java\nMetadataStore store = MetadataStoreFactory.create(metadataURL, config);\nif (!(store instanceof MetadataStoreExtended)) {\n    throw new IllegalArgumentException(\"Provider for \" + metadataURL + \" lacks extended API\");\n}\n","typeGuard":"boolean supportsExtended(String metadataURL, MetadataStoreConfig cfg) throws MetadataStoreException {\n    return MetadataStoreFactory.create(metadataURL, cfg) instanceof MetadataStoreExtended;\n}\n","tryCatchPattern":"try {\n    MetadataStoreExtended s = MetadataStoreFactoryImpl.createExtended(url, cfg);\n} catch (MetadataStoreException.InvalidImplementationException e) {\n    // switch to a scheme backed by MetadataStoreExtended (zk:, oxia:, rocksdb:, memory:)\n}\n","preventionTips":["Only use metadata URL schemes whose providers implement MetadataStoreExtended for broker use","Implement MetadataStoreExtended in custom providers if they will back a broker","Prefer createExtended over raw create when extended APIs are required downstream"],"tags":["metadata-store","factory","api-compatibility"],"backgroundTag":"invalid-metadata-store-implementation","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"}