From 6a684857dd8407a0347e5c1faf1d8a5895b2ade2 Mon Sep 17 00:00:00 2001 From: yyqdbngt <300715189+yyqdbngt@users.noreply.github.com> Date: Sat, 1 Aug 2026 22:41:13 +0800 Subject: [PATCH] fix: guard NPE in TopicRouteWrapper when brokerName is absent from the route getMasterAddr and getMasterAddrPrefer called brokerNameRouteData.get(brokerName).getBrokerAddrs() without a null check, so a brokerName not present in the current route snapshot (e.g. during broker failover or a stale MessageQueue) threw NullPointerException. This contradicts the contract the callers rely on: MessageQueueSelector (buildRead/buildWrite) and ClusterTopicRouteService all check the return value for null and skip the broker. Return null when the broker is missing so the existing caller handling works as intended. Compiled and verified on the build server (mvn -pl proxy -am compile). --- .../proxy/service/route/TopicRouteWrapper.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/proxy/src/main/java/org/apache/rocketmq/proxy/service/route/TopicRouteWrapper.java b/proxy/src/main/java/org/apache/rocketmq/proxy/service/route/TopicRouteWrapper.java index 7956c6284ea..0bdf6cdaae4 100644 --- a/proxy/src/main/java/org/apache/rocketmq/proxy/service/route/TopicRouteWrapper.java +++ b/proxy/src/main/java/org/apache/rocketmq/proxy/service/route/TopicRouteWrapper.java @@ -43,11 +43,19 @@ public TopicRouteWrapper(TopicRouteData topicRouteData, String topicName) { } public String getMasterAddr(String brokerName) { - return this.brokerNameRouteData.get(brokerName).getBrokerAddrs().get(MixAll.MASTER_ID); + BrokerData brokerData = this.brokerNameRouteData.get(brokerName); + if (brokerData == null) { + return null; + } + return brokerData.getBrokerAddrs().get(MixAll.MASTER_ID); } public String getMasterAddrPrefer(String brokerName) { - HashMap brokerAddr = brokerNameRouteData.get(brokerName).getBrokerAddrs(); + BrokerData brokerData = brokerNameRouteData.get(brokerName); + if (brokerData == null) { + return null; + } + HashMap brokerAddr = brokerData.getBrokerAddrs(); String addr = brokerAddr.get(MixAll.MASTER_ID); if (addr == null) { Optional optional = brokerAddr.keySet().stream().findFirst();