On Wed, May 9, 2012 at 12:12 PM, Thomas Mortagne
<[email protected]> wrote:
> On Wed, May 9, 2012 at 11:06 AM, Thomas Mortagne
> <[email protected]> wrote:
>> On Tue, May 8, 2012 at 7:12 PM, Marius Dumitru Florea
>> <[email protected]> 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).

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
>>> [email protected]
>>> http://lists.xwiki.org/mailman/listinfo/devs
>>
>>
>>
>> --
>> Thomas Mortagne
>
>
>
> --
> Thomas Mortagne
> _______________________________________________
> devs mailing list
> [email protected]
> http://lists.xwiki.org/mailman/listinfo/devs
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to