{"record":{"id":"eb4c1d276e2877b2","repo":"grpc/grpc-java","slug":"provider-not-found-for-pluginname","errorCode":null,"errorMessage":"Provider not found for ${pluginName}","messagePattern":"Provider not found for (.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"xds/src/main/java/io/grpc/xds/internal/security/certprovider/CertificateProviderStore.java","lineNumber":131,"sourceCode":"          + notifyCertUpdates\n          + \", config=\"\n          + config\n          + '}';\n    }\n  }\n\n  private final class CertProviderFactory\n      implements ReferenceCountingMap.ValueFactory<CertProviderKey, CertificateProvider> {\n\n    private CertProviderFactory() {\n    }\n\n    @Override\n    public CertificateProvider create(CertProviderKey key) {\n      CertificateProviderProvider certProviderProvider =\n          certificateProviderRegistry.getProvider(key.pluginName);\n      if (certProviderProvider == null) {\n        throw new IllegalArgumentException(\"Provider not found for \" + key.pluginName);\n      }\n      CertificateProvider certProvider = certProviderProvider.createCertificateProvider(\n              key.config, new CertificateProvider.DistributorWatcher(), key.notifyCertUpdates);\n      certProvider.start();\n      return certProvider;\n    }\n  }\n\n  @VisibleForTesting\n  public CertificateProviderStore(CertificateProviderRegistry certificateProviderRegistry) {\n    this.certificateProviderRegistry = certificateProviderRegistry;\n    certProviderMap = new ReferenceCountingMap<>(new CertProviderFactory());\n  }\n\n  /**\n   * Creates or retrieves a {@link CertificateProvider} instance, increments its ref-count and\n   * registers the watcher passed. Returns a {@link Handle} that can be {@link Handle#close()}d when\n   * the instance is no longer needed by the caller.","sourceCodeStart":113,"sourceCodeEnd":149,"githubUrl":"https://github.com/grpc/grpc-java/blob/64daddc1f3d1975670f769f3e97bde8b2ba32d25/xds/src/main/java/io/grpc/xds/internal/security/certprovider/CertificateProviderStore.java#L113-L149","documentation":"CertificateProviderStore.Factory.create looks up a CertificateProviderProvider by the plugin name declared in the xDS certificate_provider_instance config. If certificateProviderRegistry has no provider registered under key.pluginName, it throws IllegalArgumentException. This means the certificate provider plugin referenced by the config is unknown to the client at runtime.","triggerScenarios":"An xDS config (or bootstrap) references a certificate_provider_instance whose plugin_name is not registered in the CertificateProviderRegistry — e.g. 'file_watcher' or 'envoy.grpc_certificate_providers' support not on the classpath / not passed to the registry when building CertificateProviderStore.","commonSituations":"Missing grpc-xds cert provider dependencies; custom provider not registered via CertificateProviderProvider registry; typo or version mismatch between plugin_name in config and registered providers; bootstrap omitting certProviders entries.","solutions":["Add the required certificate provider implementation to the classpath (e.g. grpc-xds file watcher provider) and ensure it is registered with the CertificateProviderRegistry used to build the store","Fix the plugin_name in the xDS config/bootstrap to match a registered provider exactly","Verify gRPC bootstrap certProviders configuration and that providers were passed when constructing CertificateProviderStore","Log available registered plugin names to confirm which names are valid at runtime"],"exampleFix":"// before: registry built without providers\nCertificateProviderStore store = new CertificateProviderStore(/** empty registry **/);\n// after\nCertificateProviderRegistry registry = CertificateProviderRegistry.emptyRegistry();\nregistry.register(new FileWatcherCertificateProviderProvider());\nCertificateProviderStore store = new CertificateProviderStore(registry);","handlingStrategy":"try-catch","validationCode":"// Verify plugin name is registered before building config that references it\nCertificateProviderProvider p = registry.getProvider(pluginName);\nif (p == null) throw new IllegalArgumentException(\"No certificate provider registered for \" + pluginName);","typeGuard":null,"tryCatchPattern":"try {\n  CertificateProvider cp = storeFactory.create(key);\n} catch (IllegalArgumentException e) {\n  if (e.getMessage().startsWith(\"Provider not found\")) {\n    logger.error(\"Unknown cert provider plugin: check bootstrap certProviders and classpath\", e);\n  }\n  throw e;\n}","preventionTips":["Register all needed CertificateProviderProvider implementations (e.g. FileWatcherCertificateProviderProvider) with the registry","Match plugin_name strings in xDS config/bootstrap exactly against registered providers","Include grpc-xds cert provider dependencies in the classpath"],"tags":["xds","certificate-provider","configuration","grpc"],"backgroundTag":"resource-not-found","analyzedSha":"64daddc1f3d1975670f769f3e97bde8b2ba32d25","analyzedAt":"2026-09-08T06:14:57.704Z","contentChangedAt":"2026-09-08T06:14:57.704Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}