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