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

Aias00 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git


The following commit(s) were added to refs/heads/master by this push:
     new f00c157123 fix(admin): restore empty namespace refreshes in cluster 
mode (#7769)
f00c157123 is described below

commit f00c1571238345f85be5cb6cce15703196b4b50a
Author: lymerin <[email protected]>
AuthorDate: Sun Oct 18 08:27:30 2026 +0800

    fix(admin): restore empty namespace refreshes in cluster mode (#7769)
---
 .../ClusterDataChangedEventController.java         |  2 +-
 .../listener/ClusterDataChangedEventForwarder.java |  1 +
 .../model/dto/ClusterDataChangedEventPayload.java  | 23 +++++++++++++++++
 .../ClusterDataChangedEventControllerTest.java     |  2 ++
 .../ClusterDataChangedEventForwarderTest.java      | 29 ++++++++++++++++------
 5 files changed, 49 insertions(+), 8 deletions(-)

diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/ClusterDataChangedEventController.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/ClusterDataChangedEventController.java
index 6ef047f2f7..269d0f9a80 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/ClusterDataChangedEventController.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/ClusterDataChangedEventController.java
@@ -113,7 +113,7 @@ public class ClusterDataChangedEventController {
             return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                     .body(ShenyuAdminResult.error("unknown data change event 
group: " + groupKey.name()));
         }
-        eventPublisher.publishEvent(new DataChangedEvent(groupKey, eventType, 
source));
+        eventPublisher.publishEvent(new DataChangedEvent(groupKey, eventType, 
source, payload.getNamespaceId()));
         return ResponseEntity.ok(ShenyuAdminResult.success());
     }
 
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/ClusterDataChangedEventForwarder.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/ClusterDataChangedEventForwarder.java
index 03f1cbcbb7..90bc95db8c 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/ClusterDataChangedEventForwarder.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/listener/ClusterDataChangedEventForwarder.java
@@ -98,6 +98,7 @@ public class ClusterDataChangedEventForwarder {
         final ClusterDataChangedEventPayload payload = new 
ClusterDataChangedEventPayload(
                 event.getGroupKey().name(), event.getEventType().name(),
                 GsonUtils.getInstance().toJson(event.getSource()));
+        payload.setNamespaceId(event.getNamespaceId());
         final HttpHeaders headers = new HttpHeaders();
         headers.set(ClusterEventAuthFilter.HEADER, accessToken);
         try {
diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/ClusterDataChangedEventPayload.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/ClusterDataChangedEventPayload.java
index 3903ca82e8..11e1390e69 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/ClusterDataChangedEventPayload.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/model/dto/ClusterDataChangedEventPayload.java
@@ -42,6 +42,11 @@ public class ClusterDataChangedEventPayload implements 
Serializable {
      */
     private String source;
 
+    /**
+     * the namespace id of the event.
+     */
+    private String namespaceId;
+
     public ClusterDataChangedEventPayload() {
     }
 
@@ -111,4 +116,22 @@ public class ClusterDataChangedEventPayload implements 
Serializable {
     public void setSource(final String source) {
         this.source = source;
     }
+
+    /**
+     * Gets the namespace id.
+     *
+     * @return the namespace id
+     */
+    public String getNamespaceId() {
+        return namespaceId;
+    }
+
+    /**
+     * Sets the namespace id.
+     *
+     * @param namespaceId the namespace id
+     */
+    public void setNamespaceId(final String namespaceId) {
+        this.namespaceId = namespaceId;
+    }
 }
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/ClusterDataChangedEventControllerTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/ClusterDataChangedEventControllerTest.java
index e86ea9e989..844152e8af 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/ClusterDataChangedEventControllerTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/ClusterDataChangedEventControllerTest.java
@@ -78,6 +78,7 @@ public final class ClusterDataChangedEventControllerTest {
         String sourceJson = 
GsonUtils.getInstance().toJson(Collections.singletonList(pluginData));
         ClusterDataChangedEventPayload payload =
                 new 
ClusterDataChangedEventPayload(ConfigGroupEnum.PLUGIN.name(), 
DataEventTypeEnum.UPDATE.name(), sourceJson);
+        payload.setNamespaceId("namespace-a");
 
         ResponseEntity<?> response = controller.receive(payload);
 
@@ -85,6 +86,7 @@ public final class ClusterDataChangedEventControllerTest {
         ArgumentCaptor<DataChangedEvent> captor = 
ArgumentCaptor.forClass(DataChangedEvent.class);
         verify(eventPublisher, times(1)).publishEvent(captor.capture());
         assertEquals(ConfigGroupEnum.PLUGIN, captor.getValue().getGroupKey());
+        assertEquals("namespace-a", captor.getValue().getNamespaceId());
         assertEquals(1, captor.getValue().getSource().size());
         assertInstanceOf(PluginData.class, 
captor.getValue().getSource().get(0));
     }
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/listener/ClusterDataChangedEventForwarderTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/listener/ClusterDataChangedEventForwarderTest.java
index 139ab3ca51..8aa26f67a6 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/listener/ClusterDataChangedEventForwarderTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/listener/ClusterDataChangedEventForwarderTest.java
@@ -36,13 +36,18 @@ import org.mockito.junit.jupiter.MockitoSettings;
 import org.mockito.quality.Strictness;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
+import 
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.mock.http.MockHttpInputMessage;
+import org.springframework.mock.http.MockHttpOutputMessage;
 import org.springframework.mock.web.MockHttpServletRequest;
 import org.springframework.web.client.RestClientException;
 import org.springframework.web.client.RestTemplate;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
+import java.io.IOException;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
@@ -93,10 +98,12 @@ public final class ClusterDataChangedEventForwarderTest {
 
     /**
      * Forward posts the serialized event, authenticated with the dedicated 
node credential,
-     * to the master url built from the master dto.
+     * to the master url built from the master dto, preserving an empty 
refresh's namespace.
+     *
+     * @throws IOException if the payload cannot be serialized or deserialized
      */
     @Test
-    public void forwardPostsPayloadToMasterUrlTest() {
+    public void forwardPostsPayloadToMasterUrlTest() throws IOException {
         ClusterMasterDTO master = new ClusterMasterDTO();
         master.setMasterHost("10.0.0.2");
         master.setMasterPort("9095");
@@ -105,8 +112,8 @@ public final class ClusterDataChangedEventForwarderTest {
         when(restTemplate.postForEntity(any(String.class), any(Object.class), 
eq(String.class)))
                 .thenReturn(ResponseEntity.ok("ok"));
 
-        DataChangedEvent event = new DataChangedEvent(ConfigGroupEnum.PLUGIN, 
DataEventTypeEnum.UPDATE,
-                Collections.singletonList(new PluginData()));
+        DataChangedEvent event = new DataChangedEvent(ConfigGroupEnum.RULE, 
DataEventTypeEnum.REFRESH,
+                Collections.emptyList(), "namespace-a");
         boolean forwarded = forwarder.forward(event);
 
         assertTrue(forwarded);
@@ -116,9 +123,17 @@ public final class ClusterDataChangedEventForwarderTest {
         assertEquals("node-secret", captor.getValue().getHeaders().getFirst(
                 
org.apache.shenyu.admin.shiro.bean.ClusterEventAuthFilter.HEADER));
         
org.junit.jupiter.api.Assertions.assertNull(captor.getValue().getHeaders().getFirst(Constants.X_ACCESS_TOKEN));
-        assertEquals(ConfigGroupEnum.PLUGIN.name(), 
captor.getValue().getBody().getGroupKey());
-        assertEquals(DataEventTypeEnum.UPDATE.name(), 
captor.getValue().getBody().getEventType());
-        assertTrue(captor.getValue().getBody().getSource().startsWith("["));
+        ClusterDataChangedEventPayload payload = captor.getValue().getBody();
+        assertEquals(ConfigGroupEnum.RULE.name(), payload.getGroupKey());
+        assertEquals(DataEventTypeEnum.REFRESH.name(), payload.getEventType());
+        assertEquals("[]", payload.getSource());
+        assertEquals("namespace-a", payload.getNamespaceId());
+        MappingJackson2HttpMessageConverter converter = new 
MappingJackson2HttpMessageConverter();
+        MockHttpOutputMessage output = new MockHttpOutputMessage();
+        converter.write(payload, MediaType.APPLICATION_JSON, output);
+        ClusterDataChangedEventPayload deserialized = 
(ClusterDataChangedEventPayload) converter.read(
+                ClusterDataChangedEventPayload.class, new 
MockHttpInputMessage(output.getBodyAsBytes()));
+        assertEquals("namespace-a", deserialized.getNamespaceId());
     }
 
     /**

Reply via email to