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:49:58 UTC

[jira] [Updated] (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:all-tabpanel ]

Francesco Mari updated OAK-5405:
--------------------------------
    Attachment: OAK-5405-01.patch

The first iteration of the patch replaces one recursive algorithm in {{MutableTree}} with an iterative variant. There are other snippets of code in {{MutableTree}} that should be rewritten in a similar way, but before going further I would like to hear from the rest of the team. [~mduerig], what do you think about this issue?

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