Fix the bug that legacy API matchers in ScGatewayApiMatcherManager were not removed (#2436)

* Fix the bug that legacy API matchers in SC gateway adapter GatewayApiMatcherManager were not removed after the API group has been removed
This commit is contained in:
suyh 2021-11-29 20:24:24 +08:00 committed by Eric Zhao
parent 3e9f42efce
commit 051d583fd8
1 changed files with 9 additions and 12 deletions

View File

@ -15,23 +15,23 @@
*/ */
package com.alibaba.csp.sentinel.adapter.gateway.sc.api; package com.alibaba.csp.sentinel.adapter.gateway.sc.api;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition;
import com.alibaba.csp.sentinel.adapter.gateway.sc.api.matcher.WebExchangeApiMatcher;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition;
import com.alibaba.csp.sentinel.adapter.gateway.sc.api.matcher.WebExchangeApiMatcher;
/** /**
* @author Eric Zhao * @author Eric Zhao
* @since 1.6.0 * @since 1.6.0
*/ */
public final class GatewayApiMatcherManager { public final class GatewayApiMatcherManager {
private static final Map<String, WebExchangeApiMatcher> API_MATCHER_MAP = new ConcurrentHashMap<>(); private static volatile Map<String, WebExchangeApiMatcher> API_MATCHER_MAP = new HashMap<>();
public static Map<String, WebExchangeApiMatcher> getApiMatcherMap() { public static Map<String, WebExchangeApiMatcher> getApiMatcherMap() {
return Collections.unmodifiableMap(API_MATCHER_MAP); return Collections.unmodifiableMap(API_MATCHER_MAP);
@ -50,15 +50,12 @@ public final class GatewayApiMatcherManager {
} }
static synchronized void loadApiDefinitions(/*@Valid*/ Set<ApiDefinition> definitions) { static synchronized void loadApiDefinitions(/*@Valid*/ Set<ApiDefinition> definitions) {
if (definitions == null || definitions.isEmpty()) { Map<String, WebExchangeApiMatcher> apiMatcherMap = new HashMap<>();
API_MATCHER_MAP.clear(); for (ApiDefinition definition : definitions) {
return; apiMatcherMap.put(definition.getApiName(), new WebExchangeApiMatcher(definition));
} }
definitions.forEach(GatewayApiMatcherManager::addApiDefinition);
}
static void addApiDefinition(ApiDefinition definition) { API_MATCHER_MAP = apiMatcherMap;
API_MATCHER_MAP.put(definition.getApiName(), new WebExchangeApiMatcher(definition));
} }
private GatewayApiMatcherManager() {} private GatewayApiMatcherManager() {}