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 1985d75c fix(cluster): fail cluster detail refresh and config updates 
loudly (#1665)
1985d75c is described below

commit 1985d75c02f01efd1e583d439329d13b22c317c4
Author: aias00 <[email protected]>
AuthorDate: Tue Aug 11 20:46:31 2026 +0800

    fix(cluster): fail cluster detail refresh and config updates loudly (#1665)
---
 .../studio/provider/apache/RocketMQClusterProvider.java |  6 +++++-
 .../studio/cluster/broker/ClusterServiceTest.java       | 17 +++++++++++++++++
 .../provider/apache/RocketMQClusterProviderTest.java    | 13 +++++++++++++
 3 files changed, 35 insertions(+), 1 deletion(-)

diff --git 
a/server/src/main/java/org/apache/rocketmq/studio/provider/apache/RocketMQClusterProvider.java
 
b/server/src/main/java/org/apache/rocketmq/studio/provider/apache/RocketMQClusterProvider.java
index 479bb0ec..236fd5cb 100644
--- 
a/server/src/main/java/org/apache/rocketmq/studio/provider/apache/RocketMQClusterProvider.java
+++ 
b/server/src/main/java/org/apache/rocketmq/studio/provider/apache/RocketMQClusterProvider.java
@@ -132,8 +132,12 @@ public class RocketMQClusterProvider implements 
ClusterProvider {
                 return buildClusterVO(clusterId, brokers, nameServers);
             });
         } catch (Exception e) {
+            if (e instanceof BusinessException businessException) {
+                throw businessException;
+            }
             log.warn("Failed to refresh cluster detail for {}: {}", clusterId, 
e.getMessage());
-            return null;
+            throw new BusinessException(502,
+                    "Failed to refresh cluster detail for " + clusterId + ": " 
+ rootMessage(e));
         }
     }
 
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 15dadc38..97639b7f 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
@@ -379,6 +379,23 @@ class ClusterServiceTest {
                 .hasMessageContaining("Cluster not found: missing");
     }
 
+    @Test
+    void updateConfigShouldNotFallBackToPersistedClusterWhenLiveRefreshFails() 
{
+        when(clusterProvider.refreshClusterDetail("cluster-1"))
+                .thenThrow(new BusinessException(502, "NameServer 
unavailable"));
+
+        UpdateConfigDTO command = UpdateConfigDTO.builder()
+                .id("cluster-1")
+                .flushDiskType("SYNC_FLUSH")
+                .build();
+
+        assertThatThrownBy(() -> clusterService.updateClusterConfig(command))
+                .isInstanceOf(BusinessException.class)
+                .hasMessageContaining("NameServer unavailable")
+                .satisfies(ex -> assertThat(((BusinessException) 
ex).getCode()).isEqualTo(502));
+        verify(clusterRepository, never()).findById("cluster-1");
+    }
+
     @Test
     void updateConfigShouldRejectInvalidFlushDiskType() {
         
when(clusterRepository.findById("cluster-1")).thenReturn(Optional.of(sampleCluster));
diff --git 
a/server/src/test/java/org/apache/rocketmq/studio/provider/apache/RocketMQClusterProviderTest.java
 
b/server/src/test/java/org/apache/rocketmq/studio/provider/apache/RocketMQClusterProviderTest.java
index 83ad8f74..f9111598 100644
--- 
a/server/src/test/java/org/apache/rocketmq/studio/provider/apache/RocketMQClusterProviderTest.java
+++ 
b/server/src/test/java/org/apache/rocketmq/studio/provider/apache/RocketMQClusterProviderTest.java
@@ -92,6 +92,19 @@ class RocketMQClusterProviderTest {
         assertThat(cluster.getTpsHistory()).isNotNull().isEmpty();
     }
 
+    @Test
+    void 
refreshClusterDetailShouldSurfaceNameServerFailuresInsteadOfReturningNull() 
throws Exception {
+        DefaultMQAdminExt adminExt = mock(DefaultMQAdminExt.class);
+        RocketMQClusterProvider provider = newProvider(adminExt);
+        when(adminExt.examineBrokerClusterInfo()).thenThrow(new 
IllegalStateException("NameServer unavailable"));
+
+        assertThatThrownBy(() -> 
provider.refreshClusterDetail("DefaultCluster"))
+                .isInstanceOfSatisfying(BusinessException.class, error -> {
+                    assertThat(error.getCode()).isEqualTo(502);
+                    assertThat(error.getMessage()).contains("NameServer 
unavailable");
+                });
+    }
+
     @Test
     void discoverClustersMarksWarningWhenBrokerRuntimeStatsAreUnavailable() 
throws Exception {
         DefaultMQAdminExt adminExt = mock(DefaultMQAdminExt.class);

Reply via email to