You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-issues@jackrabbit.apache.org by "Francesco Mari (JIRA)" <ji...@apache.org> on 2017/01/04 14:46:58 UTC

[jira] [Created] (OAK-5405) MutableTree might overflow the stack for very deep trees

Francesco Mari created OAK-5405:
-----------------------------------

             Summary: MutableTree might overflow the stack for very deep trees
                 Key: OAK-5405
                 URL: https://issues.apache.org/jira/browse/OAK-5405
             Project: Jackrabbit Oak
          Issue Type: Improvement
          Components: core
            Reporter: Francesco Mari
            Assignee: Francesco Mari
            Priority: Minor
             Fix For: 1.6


The recursive nature of {{MutableTree}} might contribute to overflow the call stack if the tree is excessively deep. Following is an extract of a stack trace showing an occurrence of this problem in practice.

{noformat}
16.12.2016 16:56:29.727 *ERROR* [0:0:0:0:0:0:0:1 [1481887589402] POST /libs/wcm/core/content/reference.json HTTP/1.1] org.apache.sling.engine.impl.SlingRequestProcessorImpl service: Uncaught Throwable
java.lang.StackOverflowError: null
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
  at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.applyPendingMoves(MutableTree.java:360)
	at org.apache.jackrabbit.oak.core.MutableTree.beforeRead(MutableTree.java:334)
	at org.apache.jackrabbit.oak.core.MutableTree.getChild(MutableTree.java:160)
	at org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate.getItem(SessionDelegate.java:444)
	at org.apache.jackrabbit.oak.jcr.session.SessionImpl.getItemInternal(SessionImpl.java:166)
	at org.apache.jackrabbit.oak.jcr.session.SessionImpl.access$400(SessionImpl.java:81)
	at org.apache.jackrabbit.oak.jcr.session.SessionImpl$3.performNullable(SessionImpl.java:228)
	at org.apache.jackrabbit.oak.jcr.session.SessionImpl$3.performNullable(SessionImpl.java:225)
	at org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate.performNullable(SessionDelegate.java:243)
	at org.apache.jackrabbit.oak.jcr.session.SessionImpl.getItemOrNull(SessionImpl.java:225)
	...
	at org.apache.sling.jcr.resource.internal.helper.jcr.JcrItemResourceFactory.getItemOrNull(JcrItemResourceFactory.java:184)
	at org.apache.sling.jcr.resource.internal.helper.jcr.JcrItemResourceFactory.createResource(JcrItemResourceFactory.java:96)
	at org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProvider.getResource(JcrResourceProvider.java:300)
	at org.apache.sling.resourceresolver.impl.providers.stateful.AuthenticatedResourceProvider.getResource(AuthenticatedResourceProvider.java:135)
	at org.apache.sling.resourceresolver.impl.helper.ResourceResolverControl.getResource(ResourceResolverControl.java:223)
	at org.apache.sling.resourceresolver.impl.ResourceResolverImpl.getAbsoluteResourceInternal(ResourceResolverImpl.java:1067)
	at org.apache.sling.resourceresolver.impl.ResourceResolverImpl.getResourceInternal(ResourceResolverImpl.java:688)
	at org.apache.sling.resourceresolver.impl.ResourceResolverImpl.getResource(ResourceResolverImpl.java:642)
	at org.apache.sling.resourceresolver.impl.ResourceResolverImpl.getResourceInternal(ResourceResolverImpl.java:699)
	at org.apache.sling.resourceresolver.impl.ResourceResolverImpl.getResource(ResourceResolverImpl.java:642)
	...
	at org.apache.sling.api.servlets.SlingAllMethodsServlet.mayService(SlingAllMethodsServlet.java:149)
	at org.apache.sling.api.servlets.SlingSafeMethodsServlet.service(SlingSafeMethodsServlet.java:346)
	at org.apache.sling.api.servlets.SlingSafeMethodsServlet.service(SlingSafeMethodsServlet.java:378)
	at org.apache.sling.engine.impl.request.RequestData.service(RequestData.java:552)
	at org.apache.sling.engine.impl.filter.SlingComponentFilterChain.render(SlingComponentFilterChain.java:44)
	at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:77)
	...
{noformat}

This stack trace is caused by a piece of code that generates a path with more that 130K components. Regardless that this use case shows a new level of degeneration, we should evaluate the possibility to avoid this situation or to report a better error message when this kind of exception occurs.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)