From a1ce97677c4883efa576fcfbb3ec4962b2989cf4 Mon Sep 17 00:00:00 2001 From: cdfive <31885791+cdfive@users.noreply.github.com> Date: Wed, 19 Aug 2020 23:55:11 +0800 Subject: [PATCH] webmvc-adapter: improve to avoid ErrorEntryFreeException (#1533) If entry already exists in request just skip creation. --- .../webmvc/AbstractSentinelInterceptor.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/sentinel-adapter/sentinel-spring-webmvc-adapter/src/main/java/com/alibaba/csp/sentinel/adapter/spring/webmvc/AbstractSentinelInterceptor.java b/sentinel-adapter/sentinel-spring-webmvc-adapter/src/main/java/com/alibaba/csp/sentinel/adapter/spring/webmvc/AbstractSentinelInterceptor.java index b065c54c..c4de7847 100644 --- a/sentinel-adapter/sentinel-spring-webmvc-adapter/src/main/java/com/alibaba/csp/sentinel/adapter/spring/webmvc/AbstractSentinelInterceptor.java +++ b/sentinel-adapter/sentinel-spring-webmvc-adapter/src/main/java/com/alibaba/csp/sentinel/adapter/spring/webmvc/AbstractSentinelInterceptor.java @@ -61,9 +61,7 @@ public abstract class AbstractSentinelInterceptor implements HandlerInterceptor String origin = parseOrigin(request); String contextName = getContextName(request); ContextUtil.enter(contextName, origin); - Entry entry = SphU.entry(resourceName, ResourceTypeConstants.COMMON_WEB, EntryType.IN); - - setEntryInRequest(request, baseWebMvcConfig.getRequestAttributeName(), entry); + setEntryInRequest(request, baseWebMvcConfig.getRequestAttributeName(), resourceName); } return true; } catch (BlockException e) { @@ -110,12 +108,22 @@ public abstract class AbstractSentinelInterceptor implements HandlerInterceptor ModelAndView modelAndView) throws Exception { } - protected void setEntryInRequest(HttpServletRequest request, String name, Entry entry) { + /** + * Note: + * If the attribute key already exists in request, don't create new {@link Entry}, + * to guarantee the order of {@link Entry} in pair and avoid {@link com.alibaba.csp.sentinel.ErrorEntryFreeException}. + * + * Refer to: + * https://github.com/alibaba/Sentinel/issues/1531 + * https://github.com/alibaba/Sentinel/issues/1482 + */ + protected void setEntryInRequest(HttpServletRequest request, String name, String resourceName) throws BlockException { Object attrVal = request.getAttribute(name); if (attrVal != null) { RecordLog.warn("[{}] The attribute key '{}' already exists in request, please set `requestAttributeName`", getClass().getSimpleName(), name); } else { + Entry entry = SphU.entry(resourceName, ResourceTypeConstants.COMMON_WEB, EntryType.IN); request.setAttribute(name, entry); } }