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 09ba8d26a3 fix(sync-apollo): only skip list index keys ending with 
".list" (#7988)
09ba8d26a3 is described below

commit 09ba8d26a38b4031e237b641c8365779b84b4305
Author: Duansg <[email protected]>
AuthorDate: Thu Oct 22 19:06:43 2026 -0700

    fix(sync-apollo): only skip list index keys ending with ".list" (#7988)
---
 .../shenyu/sync/data/apollo/ApolloDataService.java |  5 +-
 .../sync/data/apollo/ApolloDataServiceTest.java    | 75 +++++++++++++++++++++-
 2 files changed, 74 insertions(+), 6 deletions(-)

diff --git 
a/shenyu-sync-data-center/shenyu-sync-data-apollo/src/main/java/org/apache/shenyu/sync/data/apollo/ApolloDataService.java
 
b/shenyu-sync-data-center/shenyu-sync-data-apollo/src/main/java/org/apache/shenyu/sync/data/apollo/ApolloDataService.java
index e2f8680426..6a4fe8f538 100644
--- 
a/shenyu-sync-data-center/shenyu-sync-data-apollo/src/main/java/org/apache/shenyu/sync/data/apollo/ApolloDataService.java
+++ 
b/shenyu-sync-data-center/shenyu-sync-data-apollo/src/main/java/org/apache/shenyu/sync/data/apollo/ApolloDataService.java
@@ -95,9 +95,8 @@ public class ApolloDataService extends 
AbstractNodeDataSyncService implements Sy
                     return;
                 }
                 final String newValue = configChange.getNewValue();
-                // skip last is "list"
-                final int lastListStrIndex = changeKey.length() - 
DefaultNodeConstants.LIST_STR.length();
-                if (changeKey.lastIndexOf(DefaultNodeConstants.LIST_STR) == 
lastListStrIndex) {
+                // Skip list index keys.
+                if (changeKey.endsWith(DefaultNodeConstants.POINT_LIST)) {
                     return;
                 }
                 // check prefix
diff --git 
a/shenyu-sync-data-center/shenyu-sync-data-apollo/src/test/java/org/apache/shenyu/sync/data/apollo/ApolloDataServiceTest.java
 
b/shenyu-sync-data-center/shenyu-sync-data-apollo/src/test/java/org/apache/shenyu/sync/data/apollo/ApolloDataServiceTest.java
index 20e86c6cd1..9c54483b6e 100644
--- 
a/shenyu-sync-data-center/shenyu-sync-data-apollo/src/test/java/org/apache/shenyu/sync/data/apollo/ApolloDataServiceTest.java
+++ 
b/shenyu-sync-data-center/shenyu-sync-data-apollo/src/test/java/org/apache/shenyu/sync/data/apollo/ApolloDataServiceTest.java
@@ -24,9 +24,11 @@ import com.ctrip.framework.apollo.model.ConfigChange;
 import com.ctrip.framework.apollo.model.ConfigChangeEvent;
 import org.apache.shenyu.common.config.ShenyuConfig;
 import org.apache.shenyu.common.constant.ApolloPathConstants;
+import org.apache.shenyu.common.dto.AppAuthData;
 import org.apache.shenyu.common.dto.PluginData;
 import org.apache.shenyu.common.dto.ProxySelectorData;
 import org.apache.shenyu.common.dto.RuleData;
+import org.apache.shenyu.common.dto.SelectorData;
 import org.apache.shenyu.sync.data.api.AuthDataSubscriber;
 import org.apache.shenyu.sync.data.api.DiscoveryUpstreamDataSubscriber;
 import org.apache.shenyu.sync.data.api.MetaDataSubscriber;
@@ -35,6 +37,8 @@ import 
org.apache.shenyu.sync.data.api.ProxySelectorDataSubscriber;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EnumSource;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
@@ -178,6 +182,27 @@ class ApolloDataServiceTest {
         assertEquals("test-plugin", captor.getValue().getName());
     }
 
+    @ParameterizedTest
+    @EnumSource(PropertyChangeType.class)
+    void testPluginDataKeyEndingWithList(final PropertyChangeType changeType) {
+        createApolloDataService();
+
+        final ConfigChangeEvent event = mockConfigChangeEvent(
+                NAMESPACE + "." + ApolloPathConstants.PLUGIN_DATA_ID + 
".blacklist",
+                PropertyChangeType.DELETED.equals(changeType) ? null : 
"{\"name\":\"blacklist\"}",
+                changeType
+        );
+
+        capturedListener.onChange(event);
+        final ArgumentCaptor<PluginData> captor = 
ArgumentCaptor.forClass(PluginData.class);
+        if (PropertyChangeType.DELETED.equals(changeType)) {
+            verify(pluginDataSubscriber).unSubscribe(captor.capture());
+        } else {
+            verify(pluginDataSubscriber).onSubscribe(captor.capture());
+        }
+        assertEquals("blacklist", captor.getValue().getName());
+    }
+
     @Test
     void testSelectorDataChange() {
         ApolloDataService apolloDataService = createApolloDataService();
@@ -192,6 +217,28 @@ class ApolloDataServiceTest {
         verify(pluginDataSubscriber, times(1)).onSelectorSubscribe(any());
     }
 
+    @ParameterizedTest
+    @EnumSource(PropertyChangeType.class)
+    void testSelectorDataKeyEndingWithList(final PropertyChangeType 
changeType) {
+        createApolloDataService();
+
+        final ConfigChangeEvent event = mockConfigChangeEvent(
+                NAMESPACE + "." + ApolloPathConstants.SELECTOR_DATA_ID + 
".test-plugin.selector-whitelist",
+                PropertyChangeType.DELETED.equals(changeType) ? null : 
"{\"id\":\"selector-whitelist\",\"pluginName\":\"test-plugin\"}",
+                changeType
+        );
+
+        capturedListener.onChange(event);
+        final ArgumentCaptor<SelectorData> captor = 
ArgumentCaptor.forClass(SelectorData.class);
+        if (PropertyChangeType.DELETED.equals(changeType)) {
+            verify(pluginDataSubscriber).unSelectorSubscribe(captor.capture());
+        } else {
+            verify(pluginDataSubscriber).onSelectorSubscribe(captor.capture());
+        }
+        assertEquals("selector-whitelist", captor.getValue().getId());
+        assertEquals("test-plugin", captor.getValue().getPluginName());
+    }
+
     @Test
     void testRuleDataChange() {
         ApolloDataService apolloDataService = createApolloDataService();
@@ -238,6 +285,27 @@ class ApolloDataServiceTest {
         verify(authDataSubscriber, times(1)).onSubscribe(any());
     }
 
+    @ParameterizedTest
+    @EnumSource(PropertyChangeType.class)
+    void testAuthDataKeyEndingWithList(final PropertyChangeType changeType) {
+        createApolloDataService();
+
+        final ConfigChangeEvent event = mockConfigChangeEvent(
+                NAMESPACE + "." + ApolloPathConstants.AUTH_DATA_ID + 
".whitelist",
+                PropertyChangeType.DELETED.equals(changeType) ? null : 
"{\"appKey\":\"whitelist\"}",
+                changeType
+        );
+
+        capturedListener.onChange(event);
+        final ArgumentCaptor<AppAuthData> captor = 
ArgumentCaptor.forClass(AppAuthData.class);
+        if (PropertyChangeType.DELETED.equals(changeType)) {
+            verify(authDataSubscriber).unSubscribe(captor.capture());
+        } else {
+            verify(authDataSubscriber).onSubscribe(captor.capture());
+        }
+        assertEquals("whitelist", captor.getValue().getAppKey());
+    }
+
     @Test
     void testMetaDataChange() {
         ApolloDataService apolloDataService = createApolloDataService();
@@ -297,14 +365,15 @@ class ApolloDataServiceTest {
         verify(discoveryUpstreamDataSubscriber, times(1)).onSubscribe(any());
     }
 
-    @Test
-    void testListKeySkipped() {
+    @ParameterizedTest
+    @EnumSource(PropertyChangeType.class)
+    void testListKeySkipped(final PropertyChangeType changeType) {
         ApolloDataService apolloDataService = createApolloDataService();
 
         ConfigChangeEvent event = mockConfigChangeEvent(
                 NAMESPACE + "." + ApolloPathConstants.PLUGIN_DATA_ID + ".list",
                 "[\"test-plugin\"]",
-                PropertyChangeType.MODIFIED
+                changeType
         );
 
         capturedListener.onChange(event);

Reply via email to