[ 
https://issues.apache.org/jira/browse/OAK-5405?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15800822#comment-15800822
 ] 

Michael Dürig commented on OAK-5405:
------------------------------------

The situation is actually similar to paths on file systems: while most file 
systems apparently do not put a limit on the depth of a path themselves, 
commands, utilities, tools and applications on top of it start breaking for 
unreasonable long paths. In Oak the persistence layer does not impose a limit 
on the depth of the path. But higher layers and downstream consumers assume the 
depth to be reasonable. 

> 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
>
>         Attachments: OAK-5405-01.patch
>
>
> 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)

Reply via email to