apache/pulsar · warning · BrokerFilterBadVersionException

No version string in lookup data for broker "${brokerId}"

Error message

No version string in lookup data for broker "${brokerId}"

What it means

When building the latest-version comparison, every broker's BrokerLookupData must carry a version string. If a broker's lookup data has a null or empty brokerVersion(), getLatestVersionNumber throws BrokerFilterBadVersionException naming that broker, disabling the PreferLaterVersions feature for the lookup.

Source

Thrown at pulsar-broker/src/main/java/org/apache/pulsar/broker/loadbalance/extensions/filter/BrokerVersionFilter.java:123

     *            does not have a version string in its lookup data.
     */
    public Version getLatestVersionNumber(Map<String, BrokerLookupData> brokerMap)
            throws BrokerFilterBadVersionException {

        if (brokerMap.size() == 0) {
            throw new BrokerFilterBadVersionException(
                    "Unable to determine latest version since broker version map was empty");
        }

        Version latestVersion = null;
        for (Map.Entry<String, BrokerLookupData> entry : brokerMap.entrySet()) {
            String brokerId = entry.getKey();
            String version = entry.getValue().brokerVersion();
            if (null == version || version.length() == 0) {
                log.warn().attr("broker", brokerId)
                        .log("No version string in lookup data for broker; disabling PreferLaterVersions feature");
                // Trigger the load manager to reset all the brokers to the original set
                throw new BrokerFilterBadVersionException("No version string in lookup data for broker \""
                        + brokerId + "\"");
            }
            Version brokerVersionVersion;
            try {
                brokerVersionVersion = Version.valueOf(version);
            } catch (Exception x) {
                log.warn().attr("broker", brokerId).attr("version", version)
                        .log("Invalid version string in lookup data for broker;"
                                + " disabling PreferLaterVersions feature");
                // Trigger the load manager to reset all the brokers to the original set
                throw new BrokerFilterBadVersionException("Invalid version string in lookup data for broker \""
                        + brokerId + "\": \"" + version + "\")");
            }

            if (latestVersion == null) {
                latestVersion = brokerVersionVersion;
            } else if (Version.BUILD_AWARE_ORDER.compare(latestVersion, brokerVersionVersion) < 0) {
                latestVersion = brokerVersionVersion;

View on GitHub (pinned to 820761864e)

Solutions

  1. Fix the offending broker so it reports a real version (use a standard Pulsar distribution; ensure the version is set in the broker's lookup/load data).
  2. Restart or re-register the offending broker so its load data is rewritten.
  3. Disable the feature: preferLaterVersions=false or remove broker_version_filter from loadBalancerBrokerFilterNames.
  4. In tests, populate BrokerLookupData.brokerVersion with a valid semver string.

Example fix

// before (test stub)
BrokerLookupData data = new BrokerLookupData(url, tlsUrl, httpUrl, httpTlsUrl, ...); // version missing
// after
BrokerLookupData data = new BrokerLookupData(url, tlsUrl, httpUrl, httpTlsUrl, ..., "3.2.0", ...);
Defensive patterns

Strategy: validation

Validate before calling

String badBroker = brokerMap.entrySet().stream()
    .filter(e -> e.getValue() == null || e.getValue().brokerVersion() == null
        || e.getValue().brokerVersion().isEmpty())
    .map(Map.Entry::getKey)
    .findFirst().orElse(null);
if (badBroker != null) throw new IllegalStateException("Broker without version: " + badBroker);

Type guard

boolean hasVersion(BrokerLookupData d) {
    return d != null && d.brokerVersion() != null && !d.brokerVersion().isEmpty();
}

Try / catch

try {
    latest = filter.getLatestVersionNumber(brokerMap);
} catch (BrokerFilterBadVersionException e) {
    log.warn("PreferLaterVersions disabled: {}", e.getMessage());
}

Prevention

When it happens

Trigger: A broker registered in the load manager's broker map reports BrokerLookupData with a null/empty brokerVersion() while preferLaterVersions=true and broker_version_filter is active.

Common situations: A broker in a rolling upgrade is running an old/custom build that does not publish its version into lookup data; a broker registration was corrupted or partially written; a test stub BrokerLookupData was built without a version.

Related errors


AI-assisted analysis of apache/pulsar@820761864e (2026-09-06). Data as JSON: /api/errors/0f875020264956a5. Report an issue: GitHub.