You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rocketmq.apache.org by li...@apache.org on 2026/10/19 10:40:00 UTC

(rocketmq-dashboard) branch rocketmq-studio updated: fix(cluster): skip address-less brokers in config scan (#5769)

This is an automated email from the ASF dual-hosted git repository.

lizhimins pushed a commit to branch rocketmq-studio
in repository https://gitbox.apache.org/repos/asf/rocketmq-dashboard.git


The following commit(s) were added to refs/heads/rocketmq-studio by this push:
     new be5472544 fix(cluster): skip address-less brokers in config scan (#5769)
be5472544 is described below

commit be547254477510fda0155007b0a2de314ac9fcbb
Author: 0 <19...@qq.com>
AuthorDate: Mon Oct 19 18:39:54 2026 +0800

    fix(cluster): skip address-less brokers in config scan (#5769)
    
    Verified against `rocketmq-studio` at b88aedc34 before merging: 缺陷仍在(`cluster/broker/ClusterService.java:323` 仍是 `new java.util.TreeMap<>()`,`:327` `configs.put(broker.getAddr(), ...)` 无守卫;同族守卫仍在 `:235`、`:281`、`:50
    
    merge-tree clean against the current trunk. Merged as-is (squash) per the maintainer review of 2026-10-19.
---
 .../rocketmq/studio/cluster/broker/ClusterService.java   |  6 ++++++
 .../studio/cluster/broker/ClusterServiceTest.java        | 16 ++++++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/server/src/main/java/org/apache/rocketmq/studio/cluster/broker/ClusterService.java b/server/src/main/java/org/apache/rocketmq/studio/cluster/broker/ClusterService.java
index 19ccafa6f..45ff1039e 100644
--- a/server/src/main/java/org/apache/rocketmq/studio/cluster/broker/ClusterService.java
+++ b/server/src/main/java/org/apache/rocketmq/studio/cluster/broker/ClusterService.java
@@ -324,6 +324,12 @@ public class ClusterService {
         ClusterVO cluster = requireSingleCluster(instanceId);
         if (cluster.getBrokers() != null) {
             for (BrokerVO broker : cluster.getBrokers()) {
+                // A discovered broker can lack an address (e.g. a slave-only broker whose
+                // master is down). Skip it like the config update does instead of failing
+                // the whole per-broker config scan on a null map key.
+                if (broker == null || broker.getAddr() == null || broker.getAddr().isEmpty()) {
+                    continue;
+                }
                 configs.put(broker.getAddr(), brokerConfigService.getBrokerConfig(broker.getAddr(), instanceId));
             }
         }
diff --git a/server/src/test/java/org/apache/rocketmq/studio/cluster/broker/ClusterServiceTest.java b/server/src/test/java/org/apache/rocketmq/studio/cluster/broker/ClusterServiceTest.java
index 56a50744c..53b92463f 100644
--- a/server/src/test/java/org/apache/rocketmq/studio/cluster/broker/ClusterServiceTest.java
+++ b/server/src/test/java/org/apache/rocketmq/studio/cluster/broker/ClusterServiceTest.java
@@ -818,6 +818,22 @@ class ClusterServiceTest {
         verify(clusterProvider, never()).refreshClusterDetail(any(), any());
     }
 
+    @Test
+    void readBrokerConfigsSkipsBrokersWithoutAnAddress() {
+        // A slave-only broker whose master is down is discovered with no address; the config
+        // scan must skip it (like the config update does) instead of failing on a null key.
+        sampleCluster.setId("DefaultCluster");
+        sampleCluster.setBrokers(List.of(
+                BrokerVO.builder().name("broker-no-addr").build(),
+                BrokerVO.builder().name("broker-0").addr("10.0.0.1:10911").build()));
+        when(clusterProvider.discoverClusters("prod-apache")).thenReturn(List.of(sampleCluster));
+        when(brokerConfigService.getBrokerConfig("10.0.0.1:10911", "prod-apache"))
+                .thenReturn(sampleCluster.getConfig());
+
+        assertThat(clusterService.readBrokerConfigs("prod-apache"))
+                .containsOnlyKeys("10.0.0.1:10911");
+    }
+
     @Test
     void instanceConfigPreviewUsesTheSameDiscoveredCluster() {
         sampleCluster.setId("DefaultCluster");