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 ed00727a61 fix: invalidate rule match cache when deleting a selector 
(#6797) (#6914)
ed00727a61 is described below

commit ed00727a61ea6cedab55c154970340f566c848cc
Author: Limbo <[email protected]>
AuthorDate: Mon Aug 17 10:48:54 2026 +0800

    fix: invalidate rule match cache when deleting a selector (#6797) (#6914)
    
    * fix: remove associated rule match cache during selector unsubscription in 
CommonPluginDataSubscriber
    
    * test: remove selectorId from emptyRuleData initialization in 
CommonPluginDataSubscriberTest
    
    ---------
    
    Co-authored-by: aias00 <[email protected]>
---
 .../base/cache/CommonPluginDataSubscriber.java     |  6 +++-
 .../base/cache/CommonPluginDataSubscriberTest.java | 37 +++++++++++++++++++---
 2 files changed, 37 insertions(+), 6 deletions(-)

diff --git 
a/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/CommonPluginDataSubscriber.java
 
b/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/CommonPluginDataSubscriber.java
index 8b7d9c1c39..d71691056a 100644
--- 
a/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/CommonPluginDataSubscriber.java
+++ 
b/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/CommonPluginDataSubscriber.java
@@ -289,11 +289,15 @@ public class CommonPluginDataSubscriber implements 
PluginDataSubscriber {
             BaseDataCache.getInstance().removeSelectData(selectorData);
             Optional.ofNullable(handlerMap.get(selectorData.getPluginName()))
                     .ifPresent(handler -> 
handler.removeSelector(selectorData));
-            // remove selector match cache
+            // remove match cache
             if (selectorMatchConfig.getCache().getEnabled()) {
                 
MatchDataCache.getInstance().removeSelectorData(selectorData.getPluginName(), 
selectorData.getId());
                 
MatchDataCache.getInstance().removeEmptySelectorData(selectorData.getPluginName());
             }
+            if (ruleMatchCacheConfig.getCache().getEnabled()) {
+                
MatchDataCache.getInstance().removeRuleDataBySelector(selectorData.getPluginName(),
 selectorData.getId());
+                
MatchDataCache.getInstance().removeEmptyRuleData(selectorData.getPluginName());
+            }
         } else if (data instanceof RuleData) {
             RuleData ruleData = (RuleData) data;
             BaseDataCache.getInstance().removeRuleData(ruleData);
diff --git 
a/shenyu-plugin/shenyu-plugin-base/src/test/java/org/apache/shenyu/plugin/base/cache/CommonPluginDataSubscriberTest.java
 
b/shenyu-plugin/shenyu-plugin-base/src/test/java/org/apache/shenyu/plugin/base/cache/CommonPluginDataSubscriberTest.java
index 8f6af8f1c1..cd1d9cd1cd 100644
--- 
a/shenyu-plugin/shenyu-plugin-base/src/test/java/org/apache/shenyu/plugin/base/cache/CommonPluginDataSubscriberTest.java
+++ 
b/shenyu-plugin/shenyu-plugin-base/src/test/java/org/apache/shenyu/plugin/base/cache/CommonPluginDataSubscriberTest.java
@@ -140,13 +140,40 @@ public final class CommonPluginDataSubscriberTest {
 
     @Test
     public void testUnSelectorSubscribe() {
+        final String path = "/selector";
+        final String emptyRulePath = "/empty-rule";
+        final String unrelatedRulePath = "/unrelated-rule";
+        final MatchDataCache matchDataCache = MatchDataCache.getInstance();
         baseDataCache.cleanSelectorData();
-        SelectorData selectorData = 
SelectorData.builder().id("1").enabled(true).pluginName(mockPluginName1).build();
-        baseDataCache.cacheSelectData(selectorData);
-        
assertNotNull(baseDataCache.obtainSelectorData(selectorData.getPluginName()));
+        matchDataCache.cleanSelectorData();
+        matchDataCache.cleanRuleDataData();
 
-        commonPluginDataSubscriber.unSelectorSubscribe(selectorData);
-        assertEquals(Lists.newArrayList(), 
baseDataCache.obtainSelectorData(selectorData.getPluginName()));
+        final SelectorData selectorData = 
SelectorData.builder().id(mockSelectorId1).enabled(true).pluginName(mockPluginName1).build();
+        final RuleData ruleData = 
RuleData.builder().id("1").selectorId(mockSelectorId1).pluginName(mockPluginName1).build();
+        final RuleData emptyRuleData = 
RuleData.builder().pluginName(mockPluginName1).build();
+        final RuleData unrelatedRuleData = 
RuleData.builder().id("2").selectorId(mockSelectorId2).pluginName(mockPluginName1).build();
+        baseDataCache.cacheSelectData(selectorData);
+        matchDataCache.cacheSelectorData(path, selectorData, 100, 100);
+        matchDataCache.cacheRuleData(path, ruleData, 100, 100);
+        matchDataCache.cacheRuleData(emptyRulePath, emptyRuleData, 100, 100);
+        matchDataCache.cacheRuleData(unrelatedRulePath, unrelatedRuleData, 
100, 100);
+
+        try {
+            
assertNotNull(baseDataCache.obtainSelectorData(selectorData.getPluginName()));
+            assertEquals(selectorData, 
matchDataCache.obtainSelectorData(mockPluginName1, path));
+            assertEquals(ruleData, 
matchDataCache.obtainRuleData(mockPluginName1, path));
+
+            commonPluginDataSubscriber.unSelectorSubscribe(selectorData);
+
+            assertEquals(Lists.newArrayList(), 
baseDataCache.obtainSelectorData(selectorData.getPluginName()));
+            assertNull(matchDataCache.obtainSelectorData(mockPluginName1, 
path));
+            assertNull(matchDataCache.obtainRuleData(mockPluginName1, path));
+            assertNull(matchDataCache.obtainRuleData(mockPluginName1, 
emptyRulePath));
+            assertEquals(unrelatedRuleData, 
matchDataCache.obtainRuleData(mockPluginName1, unrelatedRulePath));
+        } finally {
+            matchDataCache.cleanSelectorData();
+            matchDataCache.cleanRuleDataData();
+        }
     }
 
     @Test

Reply via email to