From 9c4fd47888641d7da87aabe47e9ee3bc2c82e93c Mon Sep 17 00:00:00 2001 From: Senrian <47714364+Senrian@users.noreply.github.com> Date: Mon, 30 Mar 2026 13:53:10 +0800 Subject: [PATCH] Fix potential NPE in EscapeBridge when topicPublishInfo is null Issue: #10216 Add null checks for topicPublishInfo in asyncPutMessage() and asyncRemotePutMessageToSpecificQueue() methods, consistent with the existing pattern in putMessageToRemoteBroker(). --- .../apache/rocketmq/broker/failover/EscapeBridge.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/broker/src/main/java/org/apache/rocketmq/broker/failover/EscapeBridge.java b/broker/src/main/java/org/apache/rocketmq/broker/failover/EscapeBridge.java index dd37f42b2c5..84dcccaf750 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/failover/EscapeBridge.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/failover/EscapeBridge.java @@ -185,6 +185,11 @@ public CompletableFuture asyncPutMessage(MessageExtBrokerInner messageExt.setWaitStoreMsgOK(false); final TopicPublishInfo topicPublishInfo = this.brokerController.getTopicRouteInfoManager().tryToFindTopicPublishInfo(messageExt.getTopic()); + if (null == topicPublishInfo || !topicPublishInfo.ok()) { + LOG.warn("asyncPutMessage: no route info of topic {} when escaping message, msgId={}", + messageExt.getTopic(), messageExt.getMsgId()); + return CompletableFuture.completedFuture(new PutMessageResult(PutMessageStatus.PUT_TO_REMOTE_BROKER_FAIL, null, true)); + } final String producerGroup = getProducerGroup(messageExt); final MessageQueue mqSelected = topicPublishInfo.selectOneMessageQueue(); @@ -250,6 +255,11 @@ public CompletableFuture asyncRemotePutMessageToSpecificQueue( messageExt.setWaitStoreMsgOK(false); final TopicPublishInfo topicPublishInfo = this.brokerController.getTopicRouteInfoManager().tryToFindTopicPublishInfo(messageExt.getTopic()); + if (null == topicPublishInfo || !topicPublishInfo.ok()) { + LOG.warn("asyncRemotePutMessageToSpecificQueue: no route info of topic {} when escaping message, msgId={}", + messageExt.getTopic(), messageExt.getMsgId()); + return CompletableFuture.completedFuture(new PutMessageResult(PutMessageStatus.PUT_TO_REMOTE_BROKER_FAIL, null, true)); + } List mqs = topicPublishInfo.getMessageQueueList(); if (null == mqs || mqs.isEmpty()) {