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);