You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@isis.apache.org by "Dan Haywood (JIRA)" <ji...@apache.org> on 2013/09/15 12:29:51 UTC

[jira] [Created] (ISIS-533) When flushing transaction, allow for fact that flushing might cause additional persistence commands to be created, and iterate.

Dan Haywood created ISIS-533:
--------------------------------

             Summary: When flushing transaction, allow for fact that flushing might cause additional persistence commands to be created, and iterate.
                 Key: ISIS-533
                 URL: https://issues.apache.org/jira/browse/ISIS-533
             Project: Isis
          Issue Type: Bug
          Components: Core
    Affects Versions: core-1.2.0
            Reporter: Dan Haywood
            Assignee: Dan Haywood
             Fix For: core-1.3.0


Against 1.3.0-SNAPSHOT, https://github.com/apache/isis/tree/655b6c0b73f38ea8983471ea7d304b944bb9d223, 

had the following stacktrace below.

~~~~
Analysis:

In org.apache.isis.core.runtime.system.transaction.IsisTransaction#doFlush, we execute all queued persistence commands - these are typically gonna be inserts - via getContainer.persist(...) - or deletes - via getContainer().remove(...).  Looking at the code it seems that a call to a collection.addTo or collection.removeFrom also queues up an "update" command.

Anyway, if in the course of executing one of these commands in the doFlush it cascades such that another persistence command is created, then we'll get this issue.  This *could* legitimately happen if one of the persistence callbacks, such as "saved()" or "deleted()" is used.

There was a recent issue like this on Isis' .NET "sister" framework, Naked Objects .NET.  The solution was to keep flushing until there are no commands left.

~~~~~
 - java.util.ConcurrentModificationException
   -
   -
   java.util.AbstractList$Itr#checkForComodification(AbstractList.java:372)
   - java.util.AbstractList$Itr#next(AbstractList.java:343)
   -
   java.util.Collections$UnmodifiableCollection$1#next(Collections.java:1008)
   -
   org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore#executeCommands(DataNucleusObjectStore.java:360)
   -
   org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore#execute(DataNucleusObjectStore.java:355)
   -
   org.apache.isis.core.runtime.system.transaction.IsisTransaction#doFlush(IsisTransaction.java:365)
   -
   org.apache.isis.core.runtime.system.transaction.IsisTransaction#flush(IsisTransaction.java:331)
   -
   org.apache.isis.core.runtime.system.transaction.IsisTransactionManager#flushTransaction(IsisTransactionManager.java:298)
   -
   org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel#executeActionOnTargetAndProcessResults(ActionPanel.java:181)
   -
   org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel#executeActionAndProcessResults(ActionPanel.java:137)
   -
   org.apache.isis.viewer.wicket.ui.components.actions.ActionParametersFormPanel$ActionParameterForm$1#onSubmit(ActionParametersFormPanel.java:126)
   - org.apache.wicket.markup.html.form.Form#delegateSubmit(Form.java:1253)
   - org.apache.wicket.markup.html.form.Form#process(Form.java:925)
   - org.apache.wicket.markup.html.form.Form#onFormSubmitted(Form.java:771)
   - org.apache.wicket.markup.html.form.Form#onFormSubmitted(Form.java:704)
   -
   sun.reflect.NativeMethodAccessorImpl#invoke0(NativeMethodAccessorImpl.java:-2)
   -
   sun.reflect.NativeMethodAccessorImpl#invoke(NativeMethodAccessorImpl.java:39)
   -
   sun.reflect.DelegatingMethodAccessorImpl#invoke(DelegatingMethodAccessorImpl.java:25)
   - java.lang.reflect.Method#invoke(Method.java:597)
   -
   org.apache.wicket.RequestListenerInterface#internalInvoke(RequestListenerInterface.java:258)
   -
   org.apache.wicket.RequestListenerInterface#invoke(RequestListenerInterface.java:216)
   -
   org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler#invokeListener(ListenerInterfaceRequestHandler.java:240)
   -
   org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler#respond(ListenerInterfaceRequestHandler.java:226)
   -
   org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor#respond(RequestCycle.java:861)
   -
   org.apache.wicket.request.RequestHandlerStack#execute(RequestHandlerStack.java:64)
   -
   org.apache.wicket.request.cycle.RequestCycle#execute(RequestCycle.java:261)
   -
   org.apache.wicket.request.cycle.RequestCycle#processRequest(RequestCycle.java:218)
   -
   org.apache.wicket.request.cycle.RequestCycle#processRequestAndDetach(RequestCycle.java:289)
   -
   org.apache.wicket.protocol.http.WicketFilter#processRequestCycle(WicketFilter.java:259)
   -
   org.apache.wicket.protocol.http.WicketFilter#processRequest(WicketFilter.java:201)
   -
   org.apache.wicket.protocol.http.WicketFilter#doFilter(WicketFilter.java:282)
   -
   org.eclipse.jetty.servlet.ServletHandler$CachedChain#doFilter(ServletHandler.java:1326)
   -
   org.apache.shiro.web.servlet.AbstractShiroFilter#executeChain(AbstractShiroFilter.java:449)
   -
   org.apache.shiro.web.servlet.AbstractShiroFilter$1#call(AbstractShiroFilter.java:365)
   -
   org.apache.shiro.subject.support.SubjectCallable#doCall(SubjectCallable.java:90)
   -
   org.apache.shiro.subject.support.SubjectCallable#call(SubjectCallable.java:83)
   -
   org.apache.shiro.subject.support.DelegatingSubject#execute(DelegatingSubject.java:383)
   -
   org.apache.shiro.web.servlet.AbstractShiroFilter#doFilterInternal(AbstractShiroFilter.java:362)
   -
   org.apache.shiro.web.servlet.OncePerRequestFilter#doFilter(OncePerRequestFilter.java:125)
   -
   org.eclipse.jetty.servlet.ServletHandler$CachedChain#doFilter(ServletHandler.java:1326)
   -
   org.eclipse.jetty.servlet.ServletHandler#doHandle(ServletHandler.java:479)
   -
   org.eclipse.jetty.server.handler.ScopedHandler#handle(ScopedHandler.java:119)
   -
   org.eclipse.jetty.security.SecurityHandler#handle(SecurityHandler.java:520)
   -
   org.eclipse.jetty.server.session.SessionHandler#doHandle(SessionHandler.java:227)
   -
   org.eclipse.jetty.server.handler.ContextHandler#doHandle(ContextHandler.java:940)
   -
   org.eclipse.jetty.servlet.ServletHandler#doScope(ServletHandler.java:409)
   -
   org.eclipse.jetty.server.session.SessionHandler#doScope(SessionHandler.java:186)
   -
   org.eclipse.jetty.server.handler.ContextHandler#doScope(ContextHandler.java:874)
   -
   org.eclipse.jetty.server.handler.ScopedHandler#handle(ScopedHandler.java:117)
   -
   org.eclipse.jetty.server.handler.ContextHandlerCollection#handle(ContextHandlerCollection.java:250)
   -
   org.eclipse.jetty.server.handler.HandlerCollection#handle(HandlerCollection.java:149)
   -
   org.eclipse.jetty.server.handler.HandlerWrapper#handle(HandlerWrapper.java:110)
   - org.eclipse.jetty.server.Server#handle(Server.java:349)
   -
   org.eclipse.jetty.server.HttpConnection#handleRequest(HttpConnection.java:441)
   -
   org.eclipse.jetty.server.HttpConnection$RequestHandler#content(HttpConnection.java:921)
   - org.eclipse.jetty.http.HttpParser#parseNext(HttpParser.java:784)
   - org.eclipse.jetty.http.HttpParser#parseAvailable(HttpParser.java:223)
   -
   org.eclipse.jetty.server.AsyncHttpConnection#handle(AsyncHttpConnection.java:46)
   -
   org.eclipse.jetty.io.nio.SelectChannelEndPoint#handle(SelectChannelEndPoint.java:545)
   -
   org.eclipse.jetty.io.nio.SelectChannelEndPoint$1#run(SelectChannelEndPoint.java:43)
   -
   org.eclipse.jetty.util.thread.QueuedThreadPool#runJob(QueuedThreadPool.java:598)
   -
   org.eclipse.jetty.util.thread.QueuedThreadPool$3#run(QueuedThreadPool.java:533)
   - java.lang.Thread#run(Thread.java:680)



--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira