[ https://issues.apache.org/jira/browse/WW-4573?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15076140#comment-15076140 ]
victorsosa commented on WW-4573: -------------------------------- I was looking into this and we can fix this using a CopyOnWriteArrayList. This is to keep Memory consistency. > NPE/ concurrent modification exception > -------------------------------------- > > Key: WW-4573 > URL: https://issues.apache.org/jira/browse/WW-4573 > Project: Struts 2 > Issue Type: Bug > Affects Versions: 2.3.24 > Reporter: adam brin > Priority: Minor > Fix For: 2.3.25 > > > Apologies for the lack of contextual information, it appears that there were > no other errors logged that add context. But, we're seeing a few of these > each day in our production exception logs. It looks like something may have > changed in how the ValueStack has been referenced /called and thus is causing > a concurrent modification exception. > {code} > ERROR 2015-11-29 09:21:43,987 389933021 [ajp-bio-8009-exec-6841 []] > (CommonsLogger.java:42) > com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor - null > org.apache.struts2.StrutsException > at org.apache.struts2.components.UIBean.end(UIBean.java:540) > ~[struts2-core-2.3.24.1.jar:2.3.24.1] > at > org.apache.struts2.views.freemarker.tags.CallbackWriter.afterBody(CallbackWriter.java:84) > ~[struts2-core-2.3.24.1.jar:2.3.24.1] > at > freemarker.core.Environment.visitAndTransform(Environment.java:427) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.UnifiedCall.accept(UnifiedCall.java:107) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.Environment.visit(Environment.java:324) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.MixedContent.accept(MixedContent.java:54) > ~[freemarker-2.3.23.jar:2.3.23] > at > freemarker.core.Environment.visitByHiddingParent(Environment.java:345) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.IfBlock.accept(IfBlock.java:48) > ~[freemarker-2.3.23.jar:2.3.23] > at > freemarker.core.Environment.visitByHiddingParent(Environment.java:345) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:48) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.Environment.visit(Environment.java:324) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.MixedContent.accept(MixedContent.java:54) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.Environment.visit(Environment.java:324) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.Macro$Context.runMacro(Macro.java:184) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.Environment.invoke(Environment.java:701) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.UnifiedCall.accept(UnifiedCall.java:84) > ~[freemarker-2.3.23.jar:2.3.23] > at > freemarker.core.Environment.visitByHiddingParent(Environment.java:345) > ~[freemarker-2.3.23.jar:2.3.23] > at > freemarker.core.IteratorBlock$IterationContext.executeNestedBlockInner(IteratorBlock.java:240) > ~[freemarker-2.3.23.jar:2.3.23] > at > freemarker.core.IteratorBlock$IterationContext.executeNestedBlock(IteratorBlock.java:220) > ~[freemarker-2.3.23.jar:2.3.23] > at > freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:194) > ~[freemarker-2.3.23.jar:2.3.23] > at > freemarker.core.Environment.visitIteratorBlock(Environment.java:572) > ~[freemarker-2.3.23.jar:2.3.23] > at > freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:78) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.IteratorBlock.accept(IteratorBlock.java:64) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.Environment.visit(Environment.java:324) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.MixedContent.accept(MixedContent.java:54) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.Environment.visit(Environment.java:324) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.EscapeBlock.accept(EscapeBlock.java:48) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.Environment.visit(Environment.java:324) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.MixedContent.accept(MixedContent.java:54) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.Environment.visit(Environment.java:324) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.Environment.process(Environment.java:302) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.template.Template.process(Template.java:325) > ~[freemarker-2.3.23.jar:2.3.23] > at > org.apache.struts2.views.freemarker.FreemarkerResult.doExecute(FreemarkerResult.java:223) > ~[struts2-core-2.3.24.1.jar:2.3.24.1] > at > org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:191) > ~[struts2-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:369) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:273) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:167) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:76) > ~[struts2-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:229) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:191) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) > ~[struts2-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:229) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:191) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73) > ~[struts2-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91) > ~[struts2-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:139) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > org.apache.struts2.interceptor.MessageStoreInterceptor.intercept(MessageStoreInterceptor.java:197) > ~[struts2-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > org.tdar.struts.interceptor.HttpMethodInterceptor.intercept(HttpMethodInterceptor.java:29) > ~[HttpMethodInterceptor.class:?] > at > org.tdar.struts.interceptor.HttpsInterceptor.doHttpIntercept(HttpsInterceptor.java:52) > ~[HttpsInterceptor.class:?] > at > org.tdar.struts.interceptor.HttpsInterceptor.intercept(HttpsInterceptor.java:34) > ~[HttpsInterceptor.class:?] > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > org.tdar.struts.interceptor.CacheControlInterceptor.intercept(CacheControlInterceptor.java:40) > ~[CacheControlInterceptor.class:?] > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > org.tdar.struts.interceptor.SessionSecurityInterceptor.intercept(SessionSecurityInterceptor.java:85) > ~[SessionSecurityInterceptor.class:?] > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > org.tdar.struts.interceptor.ActivityLoggingInterceptor.intercept(ActivityLoggingInterceptor.java:69) > ~[ActivityLoggingInterceptor.class:?] > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244) > ~[xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:189) > [xwork-core-2.3.24.1.jar:2.3.24.1] > at > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:244) > [xwork-core-2.3.24.1.jar:2.3.24.1] > at > org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54) > [struts2-core-2.3.24.1.jar:2.3.24.1] > at > org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:564) > [struts2-core-2.3.24.1.jar:2.3.24.1] > at > org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:81) > [struts2-core-2.3.24.1.jar:2.3.24.1] > at > org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter.doFilter(StrutsExecuteFilter.java:93) > [struts2-core-2.3.24.1.jar:2.3.24.1] > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) > [tomcat-catalina-7.0.52.jar:7.0.52] > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) > [tomcat-catalina-7.0.52.jar:7.0.52] > at > com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129) > [sitemesh-2.4.2.jar:?] > at > com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77) > [sitemesh-2.4.2.jar:?] > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) > [tomcat-catalina-7.0.52.jar:7.0.52] > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) > [tomcat-catalina-7.0.52.jar:7.0.52] > at > org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter.doFilter(StrutsPrepareFilter.java:91) > [struts2-core-2.3.24.1.jar:2.3.24.1] > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) > [tomcat-catalina-7.0.52.jar:7.0.52] > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) > [tomcat-catalina-7.0.52.jar:7.0.52] > at > org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:151) > [spring-orm-4.2.2.RELEASE.jar:4.2.2.RELEASE] > at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) > [spring-web-4.2.2.RELEASE.jar:4.2.2.RELEASE] > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) > [tomcat-catalina-7.0.52.jar:7.0.52] > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) > [tomcat-catalina-7.0.52.jar:7.0.52] > at > org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) > [urlrewritefilter-4.0.4.jar:4.0.4] > at > org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) > [urlrewritefilter-4.0.4.jar:4.0.4] > at > org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) > [urlrewritefilter-4.0.4.jar:4.0.4] > at > org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:389) > [urlrewritefilter-4.0.4.jar:4.0.4] > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) > [tomcat-catalina-7.0.52.jar:7.0.52] > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) > [tomcat-catalina-7.0.52.jar:7.0.52] > at > org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71) > [log4j-web-2.4.1.jar:2.4.1] > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) > [tomcat-catalina-7.0.52.jar:7.0.52] > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) > [tomcat-catalina-7.0.52.jar:7.0.52] > at > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) > [tomcat-catalina-7.0.52.jar:7.0.52] > at > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) > [tomcat-catalina-7.0.52.jar:7.0.52] > at > org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) > [tomcat-catalina-7.0.52.jar:7.0.52] > at > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) > [tomcat-catalina-7.0.52.jar:7.0.52] > at > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) > [tomcat-catalina-7.0.52.jar:7.0.52] > at > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) > [tomcat-catalina-7.0.52.jar:7.0.52] > at > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) > [tomcat-catalina-7.0.52.jar:7.0.52] > at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:193) > [tomcat-coyote-7.0.52.jar:7.0.52] > at > org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) > [tomcat-coyote-7.0.52.jar:7.0.52] > at > org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313) > [tomcat-coyote-7.0.52.jar:7.0.52] > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > [?:1.8.0_66] > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > [?:1.8.0_66] > at java.lang.Thread.run(Thread.java:745) [?:1.8.0_66] > Caused by: java.util.ConcurrentModificationException > at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) > ~[?:1.8.0_66] > at java.util.ArrayList$Itr.next(ArrayList.java:851) ~[?:1.8.0_66] > at > org.apache.struts2.components.IteratorComponent.end(IteratorComponent.java:333) > ~[struts2-core-2.3.24.1.jar:2.3.24.1] > at > org.apache.struts2.views.freemarker.tags.CallbackWriter.afterBody(CallbackWriter.java:84) > ~[struts2-core-2.3.24.1.jar:2.3.24.1] > at > freemarker.core.Environment.visitAndTransform(Environment.java:427) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.UnifiedCall.accept(UnifiedCall.java:107) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.Environment.visit(Environment.java:324) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.MixedContent.accept(MixedContent.java:54) > ~[freemarker-2.3.23.jar:2.3.23] > at > freemarker.core.Environment.visitByHiddingParent(Environment.java:345) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.IfBlock.accept(IfBlock.java:48) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.Environment.visit(Environment.java:324) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.MixedContent.accept(MixedContent.java:54) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.Environment.visit(Environment.java:324) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.core.Environment.process(Environment.java:302) > ~[freemarker-2.3.23.jar:2.3.23] > at freemarker.template.Template.process(Template.java:325) > ~[freemarker-2.3.23.jar:2.3.23] > at > org.apache.struts2.components.template.FreemarkerTemplateEngine.renderTemplate(FreemarkerTemplateEngine.java:158) > ~[struts2-core-2.3.24.1.jar:2.3.24.1] > at > org.apache.struts2.components.UIBean.mergeTemplate(UIBean.java:584) > ~[struts2-core-2.3.24.1.jar:2.3.24.1] > at org.apache.struts2.components.UIBean.end(UIBean.java:538) > ~[struts2-core-2.3.24.1.jar:2.3.24.1] > ... 119 more > DEBUG 2015-11-29 09:21:44,034 389933068 [ajp-bio-8009-exec-6812 []] > (ActivityLoggingInterceptor.java:78) > org.tdar.struts.interceptor.ActivityLoggingInterceptor - >> activity end: > GET:/search/advanced?groups[0].starti: > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332)