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