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
- 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).
- Restart or re-register the offending broker so its load data is rewritten.
- Disable the feature: preferLaterVersions=false or remove broker_version_filter from loadBalancerBrokerFilterNames.
- 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
- Ensure all brokers run standard builds that publish a version in lookup data.
- During rolling upgrades, upgrade brokers without version metadata first.
- In tests, always populate brokerVersion on stub BrokerLookupData.
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
- Unable to determine latest version since broker version map
- Invalid version string in lookup data for broker "${brokerId
- ${loadManagerClass} does not support this operation
- No available broker found.
- No latest service lookup data found.
AI-assisted analysis of apache/pulsar@820761864e (2026-09-06).
Data as JSON: /api/errors/0f875020264956a5.
Report an issue: GitHub.