[ https://issues.apache.org/jira/browse/WW-4485?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lukasz Lenart resolved WW-4485. ------------------------------- Resolution: Fixed Assignee: Lukasz Lenart OGNL 3.0.11 is underway to the Central :) > New cacheKey is too expensive to create > --------------------------------------- > > Key: WW-4485 > URL: https://issues.apache.org/jira/browse/WW-4485 > Project: Struts 2 > Issue Type: Bug > Components: Core Actions, Expression Language > Reporter: Jasper Rosenberg > Assignee: Lukasz Lenart > Priority: Blocker > Labels: ognl > Fix For: 2.5 > > > So we pushed ognl 3.0.10 to production this afternoon, and promptly had to > rollback because load on the servers went through the roof. Looking at the > stack traces, the issue was tons of threads doing this: > {noformat} > at java.lang.Class.getEnclosingMethod0(Native Method) > at java.lang.Class.getEnclosingMethodInfo(Class.java:1059) > at java.lang.Class.isLocalOrAnonymousClass(Class.java:1449) > at java.lang.Class.getCanonicalName(Class.java:1377) > at ognl.OgnlRuntime.buildCacheKey(OgnlRuntime.java:1944) > at ognl.OgnlRuntime.getGetMethod(OgnlRuntime.java:1926) > at ognl.OgnlRuntime.hasGetMethod(OgnlRuntime.java:1985) > at ognl.OgnlRuntime.hasGetProperty(OgnlRuntime.java:2045) > at > com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor.getProperty(CompoundRootAccessor.java:141) > {noformat} > The problem is that the change to buildCacheKey() for > https://issues.apache.org/jira/browse/WW-4113 is way to expensive considering > how often it is called. > I'd like to suggest replacing the current buildCacheKey() implementation with > this: > {code:java} > private static Object buildCacheKey(Class targetClass, String > propertyName) { > return new CacheKey(targetClass, propertyName); > } > > private static final class CacheKey { > private final Class clazz; > private final String propertyName; > public CacheKey(Class clazz, String propertyName) { > this.clazz = clazz; > this.propertyName = propertyName; > } > > public boolean equals(Object obj) { > CacheKey cacheKey = (CacheKey) obj; > return clazz.equals(cacheKey.clazz) > && propertyName.equals(cacheKey.propertyName); > } > > public int hashCode() { > return clazz.hashCode() * 31 + propertyName.hashCode(); > } > } > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332)