Ahh, good to hear. Actually iterating twice was really unnecessary in the first place. It was originally done in order to avoid another kind of ConcurrentModificationException when attempting to use collection.remove(item) to remove the item while iterating the collection. The better way, if your collection supports it, is to use iterator.remove() as you have done.
- Chris On Thu, Mar 8, 2012 at 10:11 AM, Nguyen, Vincent (CDC/OD/OADS) (CTR) <[email protected]> wrote: > Chris, thank you for your reply. We actually did just that right before > receiving your reply and the exception seems to have gone away. > > Also, we modified the method to use iter.remove() instead of iterating twice. > Was there a reason for iterating twice? > > // erase and cleanup expired stuff > private void closeAndForgetOldResults() { > Iterator<FieldSearchResultSQLImpl> iter = > m_currentResults.values().iterator(); > ArrayList<String> toRemove = new ArrayList<String>(); > while (iter.hasNext()) { > FieldSearchResultSQLImpl r = iter.next(); > if (r.isExpired()) { > LOG.debug("listSession " + r.getToken() > + " expired; will forget it."); > iter.remove(); > } > } > } > > Vincent Vu Nguyen > Web Applications Developer > Division of Science Quality and Translation > Office of the Associate Director for Science > Centers for Disease Control and Prevention (CDC) > 404-498-0384 [email protected] > Century Bldg 2400 > Atlanta, GA 30329 > > > -----Original Message----- > From: Chris Wilper [mailto:[email protected]] > Sent: Thursday, March 08, 2012 8:51 AM > To: Support and info exchange list for Fedora users. > Subject: Re: [fcrepo-user] ConcurrentModificationException > > Hi Vincent, > > Thanks for the report. This does appear to be thread-unsafe code, and it > hasn't changed significantly since 3.2 so I expect this to be an issue with > 3.5 as well. I've created this issue to track it: > > https://jira.duraspace.org/browse/FCREPO-1075 > > At first glance, it seems that changing the type of m_currentResults to a > ConcurrentHashMap would prevent this from happening. That is, in > FieldSearchSQLImpl.java, change the following: > > > import java.util.HashMap; > > // ... > > private final HashMap<String, FieldSearchResultSQLImpl> m_currentResults = > new HashMap<String, FieldSearchResultSQLImpl>(); > > to this: > > import java.util.Map; > import java.util.concurrent.ConcurrentHashMap; > > // ... > > private final Map<String, FieldSearchResultSQLImpl> m_currentResults = > new ConcurrentHashMap<String, FieldSearchResultSQLImpl>(); > > I have compiled an alternate version of the Fedora 3.2-released revision of > that file, which includes the above changes, and have attached the .class > file to the JIRA issue above. Can you try re-running your test after putting > the new .class file into your > tomcat/webapps/fedora/WEB-INF/classes/fedora/server/search/ directory and > restarting Fedora? > > Thanks, > Chris > > On Wed, Mar 7, 2012 at 9:25 AM, Nguyen, Vincent (CDC/OD/OADS) (CTR) > <[email protected]> wrote: >> Hi, I’m seeing this error in the log when we try to run JMeter tests >> on our instance of fedora with about 500 concurrent users. Has anyone >> else encountered this? >> >> >> >> We’re running fedora version 3.2 on Windows Server 2008 box with Tomcat 6. >> We currently use Muradora as our front end. >> >> >> >> I initially thought the problem might be because “m_currentResults” >> was being modified by one thread as another thread was trying to >> access it in this method: >> >> >> >> // erase and cleanup expired stuff >> >> private void closeAndForgetOldResults() { >> >> Iterator<FieldSearchResultSQLImpl> iter = >> >> m_currentResults.values().iterator(); >> >> ArrayList<String> toRemove = new ArrayList<String>(); >> >> while (iter.hasNext()) { >> >> FieldSearchResultSQLImpl r = iter.next(); >> >> if (r.isExpired()) { >> >> LOG.debug("listSession " + r.getToken() >> >> + " expired; will forget it."); >> >> toRemove.add(r.getToken()); >> >> } >> >> } >> >> for (int i = 0; i < toRemove.size(); i++) { >> >> String token = toRemove.get(i); >> >> m_currentResults.remove(token); >> >> } >> >> } >> >> >> >> >> >> >> >> java.util.ConcurrentModificationException >> >> at java.util.HashMap$HashIterator.nextEntry(Unknown >> Source) >> >> at java.util.HashMap$ValueIterator.next(Unknown Source) >> >> at >> fedora.server.search.FieldSearchSQLImpl.closeAndForgetOldResults(Field >> SearchSQLImpl.java:387) >> >> at >> fedora.server.search.FieldSearchSQLImpl.findObjects(FieldSearchSQLImpl >> .java:337) >> >> at >> fedora.server.search.FieldSearchSQLModule.findObjects(FieldSearchSQLMo >> dule.java:184) >> >> at >> fedora.server.storage.DefaultDOManager.findObjects(DefaultDOManager.ja >> va:1882) >> >> at >> fedora.server.access.DefaultAccess.findObjects(DefaultAccess.java:694) >> >> at >> fedora.server.access.FedoraAPIABindingSOAPHTTPImpl.findObjects(FedoraA >> PIABindingSOAPHTTPImpl.java:214) >> >> at >> fedora.server.access.FedoraAPIABindingSOAPHTTPSkeleton.findObjects(Fed >> oraAPIABindingSOAPHTTPSkeleton.java:198) >> >> at sun.reflect.GeneratedMethodAccessor203.invoke(Unknown >> Source) >> >> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown >> Source) >> >> at java.lang.reflect.Method.invoke(Unknown Source) >> >> at >> org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.ja >> va:397) >> >> at >> org.apache.axis.providers.java.RPCProvider.processMessage(RPCProvider. >> java:186) >> >> at >> org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:3 >> 23) >> >> at >> org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy >> .java:32) >> >> at >> org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118) >> >> at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83) >> >> at >> org.apache.axis.handlers.soap.SOAPService.invoke(SOAPService.java:453) >> >> at >> org.apache.axis.server.AxisServer.invoke(AxisServer.java:281) >> >> at >> org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:699 >> ) >> >> at >> javax.servlet.http.HttpServlet.service(HttpServlet.java:637) >> >> at >> org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase >> .java:327) >> >> at >> javax.servlet.http.HttpServlet.service(HttpServlet.java:717) >> >> at sun.reflect.GeneratedMethodAccessor66.invoke(Unknown >> Source) >> >> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown >> Source) >> >> at java.lang.reflect.Method.invoke(Unknown Source) >> >> at >> org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:270) >> >> at >> org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:269) >> >> at java.security.AccessController.doPrivileged(Native >> Method) >> >> at javax.security.auth.Subject.doAsPrivileged(Unknown >> Source) >> >> at >> org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:30 >> 2) >> >> at >> org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.j >> ava:163) >> >> at >> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appli >> cationFilterChain.java:283) >> >> at >> org.apache.catalina.core.ApplicationFilterChain.access$000(Application >> FilterChain.java:56) >> >> at >> org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilte >> rChain.java:189) >> >> at java.security.AccessController.doPrivileged(Native >> Method) >> >> at >> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFi >> lterChain.java:185) >> >> at >> fedora.server.security.servletfilters.FilterSetup.doFilter(FilterSetup >> .java:256) >> >> at sun.reflect.GeneratedMethodAccessor74.invoke(Unknown >> Source) >> >> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown >> Source) >> >> at java.lang.reflect.Method.invoke(Unknown Source) >> >> at >> org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:270) >> >> at >> org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:269) >> >> at java.security.AccessController.doPrivileged(Native >> Method) >> >> at javax.security.auth.Subject.doAsPrivileged(Unknown >> Source) >> >> at >> org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:30 >> 2) >> >> at >> org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.j >> ava:243) >> >> at >> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appli >> cationFilterChain.java:230) >> >> at >> org.apache.catalina.core.ApplicationFilterChain.access$000(Application >> FilterChain.java:56) >> >> at >> org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilte >> rChain.java:189) >> >> at java.security.AccessController.doPrivileged(Native >> Method) >> >> at >> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFi >> lterChain.java:185) >> >> at >> fedora.server.security.servletfilters.FilterSetup.doFilter(FilterSetup >> .java:256) >> >> at sun.reflect.GeneratedMethodAccessor74.invoke(Unknown >> Source) >> >> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown >> Source) >> >> at java.lang.reflect.Method.invoke(Unknown Source) >> >> at >> org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:270) >> >> at >> org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:269) >> >> at java.security.AccessController.doPrivileged(Native >> Method) >> >> at javax.security.auth.Subject.doAsPrivileged(Unknown >> Source) >> >> at >> org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:30 >> 2) >> >> at >> org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.j >> ava:243) >> >> at >> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appli >> cationFilterChain.java:230) >> >> at >> org.apache.catalina.core.ApplicationFilterChain.access$000(Application >> FilterChain.java:56) >> >> at >> org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilte >> rChain.java:189) >> >> at java.security.AccessController.doPrivileged(Native >> Method) >> >> at >> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFi >> lterChain.java:185) >> >> at >> fedora.server.security.servletfilters.FilterSetup.doFilter(FilterSetup >> .java:256) >> >> at sun.reflect.GeneratedMethodAccessor74.invoke(Unknown >> Source) >> >> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown >> Source) >> >> at java.lang.reflect.Method.invoke(Unknown Source) >> >> at >> org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:270) >> >> at >> org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:269) >> >> at java.security.AccessController.doPrivileged(Native >> Method) >> >> at javax.security.auth.Subject.doAsPrivileged(Unknown >> Source) >> >> at >> org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:30 >> 2) >> >> at >> org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.j >> ava:243) >> >> at >> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appli >> cationFilterChain.java:230) >> >> at >> org.apache.catalina.core.ApplicationFilterChain.access$000(Application >> FilterChain.java:56) >> >> at >> org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilte >> rChain.java:189) >> >> at java.security.AccessController.doPrivileged(Native >> Method) >> >> at >> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFi >> lterChain.java:185) >> >> at >> fedora.server.security.servletfilters.FilterSetup.doFilter(FilterSetup >> .java:256) >> >> at sun.reflect.GeneratedMethodAccessor74.invoke(Unknown >> Source) >> >> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown >> Source) >> >> at java.lang.reflect.Method.invoke(Unknown Source) >> >> at >> org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:270) >> >> at >> org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:269) >> >> at java.security.AccessController.doPrivileged(Native >> Method) >> >> at javax.security.auth.Subject.doAsPrivileged(Unknown >> Source) >> >> at >> org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:30 >> 2) >> >> at >> org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.j >> ava:243) >> >> at >> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appli >> cationFilterChain.java:230) >> >> at >> org.apache.catalina.core.ApplicationFilterChain.access$000(Application >> FilterChain.java:56) >> >> at >> org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilte >> rChain.java:189) >> >> at java.security.AccessController.doPrivileged(Native >> Method) >> >> at >> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFi >> lterChain.java:185) >> >> at >> fedora.server.security.servletfilters.FilterSetup.doFilter(FilterSetup >> .java:256) >> >> at sun.reflect.GeneratedMethodAccessor74.invoke(Unknown >> Source) >> >> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown >> Source) >> >> at java.lang.reflect.Method.invoke(Unknown Source) >> >> at >> org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:270) >> >> at >> org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:269) >> >> at java.security.AccessController.doPrivileged(Native >> Method) >> >> at javax.security.auth.Subject.doAsPrivileged(Unknown >> Source) >> >> at >> org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:30 >> 2) >> >> at >> org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.j >> ava:243) >> >> at >> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appli >> cationFilterChain.java:230) >> >> at >> org.apache.catalina.core.ApplicationFilterChain.access$000(Application >> FilterChain.java:56) >> >> at >> org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilte >> rChain.java:189) >> >> at java.security.AccessController.doPrivileged(Native >> Method) >> >> at >> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFi >> lterChain.java:185) >> >> at >> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperVa >> lve.java:233) >> >> at >> org.apache.catalina.core.StandardContextValve.invoke(StandardContextVa >> lve.java:191) >> >> at >> org.apache.catalina.authenticator.AuthenticatorBase.invoke(Authenticat >> orBase.java:563) >> >> at >> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.ja >> va:127) >> >> at >> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.ja >> va:102) >> >> at >> org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:6 >> 15) >> >> at >> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValv >> e.java:109) >> >> at >> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java >> :293) >> >> at >> org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor >> .java:877) >> >> at >> org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.pro >> cess(Http11AprProtocol.java:594) >> >> at >> org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:167 >> 5) >> >> at java.lang.Thread.run(Unknown Source) >> >> >> >> >> >> >> >> Vincent Vu Nguyen >> >> >> >> >> ---------------------------------------------------------------------- >> -------- Virtualization & Cloud Management Using Capacity Planning >> Cloud computing makes use of virtualization - but cloud computing also >> focuses on allowing computing to be delivered as a service. >> http://www.accelacomm.com/jaw/sfnl/114/51521223/ >> _______________________________________________ >> Fedora-commons-users mailing list >> [email protected] >> https://lists.sourceforge.net/lists/listinfo/fedora-commons-users >> > ------------------------------------------------------------------------------ > Virtualization & Cloud Management Using Capacity Planning Cloud computing > makes use of virtualization - but cloud computing also focuses on allowing > computing to be delivered as a service. > http://www.accelacomm.com/jaw/sfnl/114/51521223/ > _______________________________________________ > Fedora-commons-users mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/fedora-commons-users > ------------------------------------------------------------------------------ > Virtualization & Cloud Management Using Capacity Planning > Cloud computing makes use of virtualization - but cloud computing > also focuses on allowing computing to be delivered as a service. > http://www.accelacomm.com/jaw/sfnl/114/51521223/ > _______________________________________________ > Fedora-commons-users mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/fedora-commons-users ------------------------------------------------------------------------------ Virtualization & Cloud Management Using Capacity Planning Cloud computing makes use of virtualization - but cloud computing also focuses on allowing computing to be delivered as a service. http://www.accelacomm.com/jaw/sfnl/114/51521223/ _______________________________________________ Fedora-commons-users mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/fedora-commons-users
