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());
}
/**