{"record":{"id":"c586d6ce48109472","repo":"apache/pulsar","slug":"entry-filter-filtername-not-found","errorCode":null,"errorMessage":"Entry filter '${filterName}' not found","messagePattern":"Entry filter '(.+?)' not found","errorType":"validation","errorClass":"org.apache.pulsar.broker.service.plugin.InvalidEntryFilterException","httpStatus":null,"severity":"error","filePath":"pulsar-broker/src/main/java/org/apache/pulsar/broker/service/plugin/EntryFilterProvider.java","lineNumber":81,"sourceCode":"    }\n\n    protected void initializeBrokerEntryFilters() throws IOException {\n        if (!serviceConfiguration.getEntryFilterNames().isEmpty()) {\n            brokerEntryFilters = loadEntryFilters(serviceConfiguration.getEntryFilterNames());\n        } else {\n            brokerEntryFilters = Collections.emptyList();\n        }\n    }\n\n    public void validateEntryFilters(String entryFilterNames) throws InvalidEntryFilterException {\n        if (StringUtils.isBlank(entryFilterNames)) {\n            return;\n        }\n        final List<String> entryFilterList = readEntryFiltersString(entryFilterNames);\n        for (String filterName : entryFilterList) {\n            EntryFilterMetaData metaData = definitions.get(filterName);\n            if (metaData == null) {\n                throw new InvalidEntryFilterException(\"Entry filter '\" + filterName + \"' not found\");\n            }\n        }\n    }\n\n    private List<String> readEntryFiltersString(String entryFilterNames) {\n        final List<String> entryFilterList = Arrays.stream(entryFilterNames.split(\",\"))\n                .filter(n -> StringUtils.isNotBlank(n))\n                .toList();\n        return entryFilterList;\n    }\n\n    public List<EntryFilter> loadEntryFiltersForPolicy(EntryFilters policy)\n            throws IOException {\n        final String names = policy.getEntryFilterNames();\n        if (StringUtils.isBlank(names)) {\n            return Collections.emptyList();\n        }\n        final List<String> entryFilterList = readEntryFiltersString(names);","sourceCodeStart":63,"sourceCodeEnd":99,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/plugin/EntryFilterProvider.java#L63-L99","documentation":"EntryFilterProvider validates the topic-level 'entryFilterNames' policy against the set of entry filters registered with the broker. When a configured filter name does not match any known EntryFilterMetaData definition, an InvalidEntryFilterException is thrown during policy validation so the invalid namespace/topic policy is rejected early, before message processing.","triggerScenarios":"Calling validateEntryFilters with a policy string containing a filter name that is not present in the broker's loaded definitions map (typo, filter NAR not deployed, filter removed after policy was set).","commonSituations":"Admin sets namespace/topic policy entryFilterNames=audit-filter but the audit-filter NAR was never copied to the broker's entryFilter directory; filter renamed in a newer broker version while old policies still reference the old name; comma-separated list includes whitespace/misspelled names.","solutions":["Check available filter names in broker logs or the broker's entryFilter NAR directory and correct the policy value","Deploy the missing entry filter NAR to every broker and restart so definitions contains the name","Remove or rename the stale filter name from the namespace/topic policy"],"exampleFix":"// before\nentryFilterNames = \"AuditFilter, redact\"\n// after\nentryFilterNames = \"audit-filter\"  // exact name as registered by the deployed NAR","handlingStrategy":"validation","validationCode":"Set<String> available = broker.getEntryFilterProvider().getDefinitions().keySet();\nfor (String name : policy.getEntryFilterNames().split(\",\")) {\n    String n = name.trim();\n    if (!n.isEmpty() && !available.contains(n)) {\n        throw new IllegalArgumentException(\"Unknown entry filter: \" + n + \", available: \" + available);\n    }\n}","typeGuard":"boolean isValidEntryFilter(String name, Map<String, EntryFilterMetaData> defs) { return defs.containsKey(name); }","tryCatchPattern":"try {\n    provider.validateEntryFilters(policyString, definitions);\n} catch (InvalidEntryFilterException e) {\n    log.error(\"Policy references unknown entry filter: {}\", e.getMessage());\n}","preventionTips":["List deployed filters (definitions.keySet()) before writing policies","Keep filter NARs deployed identically across all brokers","Use exact registered names, no extra whitespace, in comma-separated lists"],"tags":["pulsar","entry-filter","configuration","policy-validation"],"backgroundTag":"unknown-plugin-name","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"}