On Wed, May 9, 2012 at 3:37 PM, Thomas Mortagne <thomas.morta...@xwiki.com> wrote: > On Wed, May 9, 2012 at 3:32 PM, Fabio Mancinelli > <fabio.mancine...@xwiki.com> wrote: >> On Wed, May 9, 2012 at 3:18 PM, Marius Dumitru Florea >> <mariusdumitru.flo...@xwiki.com> wrote: >>> On Wed, May 9, 2012 at 12:12 PM, Thomas Mortagne >>> <thomas.morta...@xwiki.com> wrote: >>>> On Wed, May 9, 2012 at 11:06 AM, Thomas Mortagne >>>> <thomas.morta...@xwiki.com> wrote: >>>>> On Tue, May 8, 2012 at 7:12 PM, Marius Dumitru Florea >>>>> <mariusdumitru.flo...@xwiki.com> wrote: >>>>>> Hi Fabio and devs, >>>>>> >>>>>> I found a serious concurrency issue in the REST server module while >>>>>> debugging the instability of the Extension Manager when >>>>>> extensions.xwiki.org repository is used (default case) . The Extension >>>>>> Manager UI searches extensions using REST and very often it gets 500 >>>>>> HTTP response code. See http://jira.xwiki.org/browse/XWIKI-7773 for >>>>>> instance. The server log from xwiki.org shows that the real cause is: >>>>>> >>>>>> May 8, 2012 5:09:14 PM org.restlet.engine.application.StatusFilter >>>>>> doHandle >>>>>> WARNING: Exception or error caught in status service >>>>>> java.util.ConcurrentModificationException >>>>>> at >>>>>> java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372) >>>>>> at java.util.AbstractList$Itr.next(AbstractList.java:343) >>>>>> at >>>>>> org.xwiki.rest.XWikiSetupCleanupFilter.afterHandle(XWikiSetupCleanupFilter.java:73) >>>>>> >>>>>> See the full stacktrace http://pastebin.com/hnFSuwem . >>>>>> >>>>>> The problem is related to the way "releasable components" are managed. >>>>>> I debugged locally both XWikiSetupCleanupFilter [1] and >>>>>> ComponentsObjectFactory and here's what I discovered: >>>>>> >>>>>> * org.restlet.Context.getCurrent() is shared across HTTP requests >>>>> >>>>> What I don't understand is that the Context is stored in a ThreadLocal >>>>> (see org.restlet.Context) so I don't see how it can be shared across >>>>> HTTP requests. Or maybe it's reused by two consecutive requests ? >>>> >>>> Actually it could be that Restlet put the same context in all the >>>> request using Context#setCurrent(). >>>> >>> >>>> We should maybe use the XWiki Execution context which has been made >>>> for use cases like that to be safe. >>> >>> Indeed. >>> >>> The code that manually releases REST resource components that have a >>> per-lookup instantiation strategy looks to me like a workaround for >>> the fact that we don't have a per-request (or per-execution) 'release' >>> strategy (i.e. components that are automatically released at the end >>> of the request/execution). >>> >> That's exactly this. To avoid memory leaks due to the allocations in >> the ComponentsObjectFactory of per-lookup components that would never >> be released otherwise. >> Re the thread issues, I thought that the context was per-request but >> AFAIU from what you're saying it's not the case. >> >> Maybe we could put a thread local providing the actual list in the >> context instead of putting the list directly. > > Either it's a Restlet bug that should be fixed or we should use > Execution context IMO. > Execution context is better, right. I don't remember why I didn't use it originally, if there was a blocking reason or just an oversight.
-Fabio >> >> -Fabio >> >>> Thanks, >>> Marius >>> >>>> >>>>> >>>>>> * as a consequence, restlet context attributes are shared across HTTP >>>>>> request >>>>>> * RELEASABLE_COMPONENT_REFERENCES context attribute is thus also shared >>>>>> * while a thread iterates this list in XWikiSetupCleanupFilter another >>>>>> thread can add a component to the list in ComponentsObjectFactory >>>>>> * the list grows indefinitely because XWikiSetupCleanupFilter only >>>>>> releases the components; it doesn't remove them from the list >>>>>> * older instances are re-released >>>>>> * since the list keeps references to older instances these instances >>>>>> can't be garbage collected >>>>>> >>>>>> Could someone more knowledgeable on the REST module (especially >>>>>> Restlet) review my findings? >>>>>> >>>>>> Thanks, >>>>>> Marius >>>>>> >>>>>> [1] >>>>>> https://github.com/xwiki/xwiki-platform/blob/master/xwiki-platform-core/xwiki-platform-rest/xwiki-platform-rest-server/src/main/java/org/xwiki/rest/XWikiSetupCleanupFilter.java >>>>>> [2] >>>>>> https://github.com/xwiki/xwiki-platform/blob/master/xwiki-platform-core/xwiki-platform-rest/xwiki-platform-rest-server/src/main/java/org/xwiki/rest/ComponentsObjectFactory.java >>>>>> _______________________________________________ >>>>>> devs mailing list >>>>>> devs@xwiki.org >>>>>> http://lists.xwiki.org/mailman/listinfo/devs >>>>> >>>>> >>>>> >>>>> -- >>>>> Thomas Mortagne >>>> >>>> >>>> >>>> -- >>>> Thomas Mortagne >>>> _______________________________________________ >>>> devs mailing list >>>> devs@xwiki.org >>>> http://lists.xwiki.org/mailman/listinfo/devs >>> _______________________________________________ >>> devs mailing list >>> devs@xwiki.org >>> http://lists.xwiki.org/mailman/listinfo/devs >> _______________________________________________ >> devs mailing list >> devs@xwiki.org >> http://lists.xwiki.org/mailman/listinfo/devs > > > > -- > Thomas Mortagne > _______________________________________________ > devs mailing list > devs@xwiki.org > http://lists.xwiki.org/mailman/listinfo/devs _______________________________________________ devs mailing list devs@xwiki.org http://lists.xwiki.org/mailman/listinfo/devs