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