You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shenyu.apache.org by zh...@apache.org on 2023/06/09 02:59:18 UTC

[shenyu] branch master updated: [type:fix] fix cache exist empty data (#4716)

This is an automated email from the ASF dual-hosted git repository.

zhangzicheng 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 3207bb15d [type:fix] fix cache exist empty data (#4716)
3207bb15d is described below

commit 3207bb15db3bb0651750742d40fb35d354e629e5
Author: moremind <he...@apache.org>
AuthorDate: Fri Jun 9 10:59:13 2023 +0800

    [type:fix] fix cache exist empty data (#4716)
    
    * [type:feat] add spring cloud cache
    
    * [type:refactor] refactor spring cloud cache
---
 .../base/cache/CommonPluginDataSubscriber.java     |  5 +++++
 .../shenyu/plugin/base/cache/MatchDataCache.java   | 25 ++++++++++++++++++++++
 .../springcloud/cache/ServiceInstanceCache.java    | 10 ++++++---
 3 files changed, 37 insertions(+), 3 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 0a71bab9f..b4489be3e 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
@@ -232,9 +232,11 @@ public class CommonPluginDataSubscriber implements PluginDataSubscriber {
             // 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());
             }
             updateSelectorTrieCache(selectorData);
         } else if (data instanceof RuleData) {
@@ -244,6 +246,7 @@ public class CommonPluginDataSubscriber implements PluginDataSubscriber {
                     .ifPresent(handler -> handler.handlerRule(ruleData));
             if (ruleMatchCacheConfig.getCache().getEnabled()) {
                 MatchDataCache.getInstance().removeRuleData(ruleData.getPluginName(), ruleData.getId());
+                MatchDataCache.getInstance().removeEmptyRuleData(ruleData.getPluginName());
             }
             updateRuleTrieCache(ruleData);
         }
@@ -286,6 +289,7 @@ public class CommonPluginDataSubscriber implements PluginDataSubscriber {
             // remove selector match cache
             if (selectorMatchConfig.getCache().getEnabled()) {
                 MatchDataCache.getInstance().removeSelectorData(selectorData.getPluginName(), selectorData.getId());
+                MatchDataCache.getInstance().removeEmptySelectorData(selectorData.getPluginName());
             }
             // remove selector trie cache
             if (selectorMatchConfig.getTrie().getEnabled()) {
@@ -298,6 +302,7 @@ public class CommonPluginDataSubscriber implements PluginDataSubscriber {
                     .ifPresent(handler -> handler.removeRule(ruleData));
             if (ruleMatchCacheConfig.getCache().getEnabled()) {
                 MatchDataCache.getInstance().removeRuleData(ruleData.getPluginName(), ruleData.getId());
+                MatchDataCache.getInstance().removeEmptyRuleData(ruleData.getPluginName());
             }
             if (ruleMatchCacheConfig.getTrie().getEnabled()) {
                 eventPublisher.publishEvent(new TrieEvent(TrieEventEnum.REMOVE, TrieCacheTypeEnum.RULE, ruleData));
diff --git a/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/MatchDataCache.java b/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/MatchDataCache.java
index 670ead2cd..2993a5cc8 100644
--- a/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/MatchDataCache.java
+++ b/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/cache/MatchDataCache.java
@@ -81,6 +81,19 @@ public final class MatchDataCache {
         }
         pathSelectorCache.entrySet().removeIf(entry -> selectorId.equals(entry.getValue().getId()));
     }
+    
+    /**
+     * remove empty selector data.
+     *
+     * @param pluginName plugin name
+     */
+    public void removeEmptySelectorData(final String pluginName) {
+        Map<String, SelectorData> pathSelectorCache = SELECTOR_DATA_MAP.get(pluginName);
+        if (Objects.isNull(pathSelectorCache) || pathSelectorCache.isEmpty()) {
+            return;
+        }
+        pathSelectorCache.entrySet().removeIf(entry -> Objects.isNull(entry.getValue().getId()));
+    }
 
     /**
      * Clean selector data.
@@ -164,6 +177,18 @@ public final class MatchDataCache {
         pathRuleDataCache.entrySet().removeIf(entry -> selectorId.equals(entry.getValue().getSelectorId()));
     }
     
+    /**
+     * remove empty rule data.
+     *
+     * @param pluginName plugin name
+     */
+    public void removeEmptyRuleData(final String pluginName) {
+        Map<String, RuleData> pathRuleDataCache = RULE_DATA_MAP.get(pluginName);
+        if (Objects.isNull(pathRuleDataCache) || pathRuleDataCache.isEmpty()) {
+            return;
+        }
+        pathRuleDataCache.entrySet().removeIf(entry -> Objects.isNull(entry.getValue().getId()));
+    }
     
     /**
      * clear the cache.
diff --git a/shenyu-plugin/shenyu-plugin-springcloud/src/main/java/org/apache/shenyu/plugin/springcloud/cache/ServiceInstanceCache.java b/shenyu-plugin/shenyu-plugin-springcloud/src/main/java/org/apache/shenyu/plugin/springcloud/cache/ServiceInstanceCache.java
index d24448383..1f3e40f68 100644
--- a/shenyu-plugin/shenyu-plugin-springcloud/src/main/java/org/apache/shenyu/plugin/springcloud/cache/ServiceInstanceCache.java
+++ b/shenyu-plugin/shenyu-plugin-springcloud/src/main/java/org/apache/shenyu/plugin/springcloud/cache/ServiceInstanceCache.java
@@ -18,12 +18,13 @@
 package org.apache.shenyu.plugin.springcloud.cache;
 
 import com.google.common.collect.Maps;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.cloud.client.ServiceInstance;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 public class ServiceInstanceCache {
     
@@ -36,8 +37,8 @@ public class ServiceInstanceCache {
      * @param serviceInstances service instance list
      */
     public static void cacheServiceInstance(final String serviceId, final List<ServiceInstance> serviceInstances) {
-        if (StringUtils.isNotBlank(serviceId) && CollectionUtils.isNotEmpty(serviceInstances)) {
-            SERVICE_INSTANCE_MAP.put(serviceId, serviceInstances);
+        if (StringUtils.isNotBlank(serviceId)) {
+            SERVICE_INSTANCE_MAP.put(serviceId, Optional.ofNullable(serviceInstances).orElse(Collections.emptyList()));
         }
     }
     
@@ -47,6 +48,9 @@ public class ServiceInstanceCache {
      * @return the list of {@linkplain ServiceInstance}
      */
     public static List<ServiceInstance> getServiceInstance(final String serviceId) {
+        if (StringUtils.isBlank(serviceId)) {
+            return Collections.emptyList();
+        }
         return SERVICE_INSTANCE_MAP.get(serviceId);
     }