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 "Michael Dürig (JIRA)" <ji...@apache.org> on 2017/01/04 15:10:58 UTC

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

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

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

Without looking at the patch (yet) I don't think we should consider this use case. Trees of this depths were never supported. Many other parts of Oak rely on recursive traversal algorithms and might also break here. 

> 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)