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
* 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/xwi…
[2]
https://github.com/xwiki/xwiki-platform/blob/master/xwiki-platform-core/xwi…