{"record":{"id":"3e0b12bf25233468","repo":"apache/pulsar","slug":"the-broker-brokeraddress-is-not-among-the-share","errorCode":null,"errorMessage":"The broker ${brokerAddress} is not among the shared broker pools for the uncontrolled namespace.","messagePattern":"The broker (.+?) is not among the shared broker pools for the uncontrolled namespace\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"pulsar-common/src/main/java/org/apache/pulsar/common/policies/impl/NamespaceIsolationPolicies.java","lineNumber":153,"sourceCode":"     * @param nsPolicy\n     *            The namespace name\n     * @param brokerAddress\n     *            The broker address is the format of host:port\n     * @return The broker assignment: {primary, secondary, shared}\n     */\n    private BrokerAssignment getBrokerAssignment(NamespaceIsolationPolicy nsPolicy, String brokerAddress) {\n        if (nsPolicy != null) {\n            if (nsPolicy.isPrimaryBroker(brokerAddress)) {\n                return BrokerAssignment.primary;\n            } else if (nsPolicy.isSecondaryBroker(brokerAddress)) {\n                return BrokerAssignment.secondary;\n            }\n            throw new IllegalArgumentException(\"The broker \" + brokerAddress\n                    + \" is not among the assigned broker pools for the controlled namespace.\");\n        }\n        // Only uncontrolled namespace will be assigned to the shared pool\n        if (!this.isSharedBroker(brokerAddress)) {\n            throw new IllegalArgumentException(\"The broker \" + brokerAddress\n                    + \" is not among the shared broker pools for the uncontrolled namespace.\");\n        }\n        return BrokerAssignment.shared;\n    }\n\n    public void assignBroker(NamespaceName nsname, BrokerStatus brkStatus, SortedSet<BrokerStatus> primaryCandidates,\n            SortedSet<BrokerStatus> secondaryCandidates, SortedSet<BrokerStatus> sharedCandidates) {\n        NamespaceIsolationPolicy nsPolicy = this.getPolicyByNamespace(nsname);\n        BrokerAssignment brokerAssignment = this.getBrokerAssignment(nsPolicy, brkStatus.getBrokerAddress());\n        if (brokerAssignment == BrokerAssignment.primary) {\n            // Only add to candidates if allowed by policy\n            if (nsPolicy != null && nsPolicy.isPrimaryBrokerAvailable(brkStatus)) {\n                primaryCandidates.add(brkStatus);\n            }\n        } else if (brokerAssignment == BrokerAssignment.secondary) {\n            secondaryCandidates.add(brkStatus);\n        } else if (brokerAssignment == BrokerAssignment.shared) {\n            sharedCandidates.add(brkStatus);","sourceCodeStart":135,"sourceCodeEnd":171,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/pulsar-common/src/main/java/org/apache/pulsar/common/policies/impl/NamespaceIsolationPolicies.java#L135-L171","documentation":"When a namespace has NO namespace-isolation policy (uncontrolled), every broker serving it must belong to a shared broker pool. getBrokerAssignment() throws IllegalArgumentException if the given broker matches no shared pool regex, because an uncontrolled namespace cannot be served by a broker outside the shared pool.","triggerScenarios":"Calling brokerAssignment/getBrokerAssignment for a broker on a namespace without an isolation policy, where the broker's URL matches none of the shared regexes in NamespaceIsolationPolicies.","commonSituations":"Cluster isolation config lists primary/secondary pools but omits 'shared' patterns; broker hostname doesn't match the shared regex (IP vs hostname); isolation data loaded from ZK is stale relative to running brokers.","solutions":["Add the broker's URL pattern to the 'shared' regex list of the namespace isolation policies","Make the shared regex broader (e.g. match all brokers in the cluster) so unassigned brokers fall into the shared pool","Align broker advertised addresses with the configured patterns (consistent hostnames)","If isolation was intentional, attach a policy for that namespace so it is treated as controlled"],"exampleFix":"// before\n\"shared\": [\"shared-broker-.*\"]   // regular brokers don't match\n// after\n\"shared\": [\".*\"]  // any broker can serve uncontrolled namespaces","handlingStrategy":"validation","validationCode":"// For uncontrolled namespaces, ensure broker is in a shared pool\nNamespaceIsolationPolicies policies = load();\nif (policies.getPolicyByNamespace(ns) == null && !policies.isSharedBroker(brokerUrl)) {\n    throw new IllegalStateException(\"Broker \" + brokerUrl + \" is not in any shared pool\");\n}","typeGuard":"static boolean brokerShareable(NamespaceIsolationPolicies p, String url) {\n    return p != null && p.isSharedBroker(url);\n}","tryCatchPattern":"try {\n    BrokerAssignment a = policies.brokerAssignment(ns, brokerUrl);\n} catch (IllegalArgumentException e) {\n    log.warn(\"Uncontrolled namespace {} served by non-shared broker {}: {}\", ns, brokerUrl, e.getMessage());\n    // fall back to shared-pool broker selection\n}","preventionTips":["Always configure a broad 'shared' regex (e.g. \".*\") so unassigned brokers are covered","Keep primary/secondary/shared regex sets mutually consistent and tested","Sync isolation config with actual broker hostnames after cluster changes","Reload namespace isolation policies after editing to avoid stale data"],"tags":["configuration","namespace-isolation","regex-mismatch"],"backgroundTag":"broker-not-in-isolation-policy","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"}