[ https://issues.apache.org/jira/browse/TINKERPOP-2626?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Stephen Mallette closed TINKERPOP-2626. --------------------------------------- Fix Version/s: 3.6.0 3.4.13 3.5.2 Assignee: Stephen Mallette Resolution: Fixed > RangeGlobalStep closes traversal prematurely > --------------------------------------------- > > Key: TINKERPOP-2626 > URL: https://issues.apache.org/jira/browse/TINKERPOP-2626 > Project: TinkerPop > Issue Type: Bug > Components: process > Affects Versions: 3.4.12, 3.5.1 > Reporter: Divij Vaidya > Assignee: Stephen Mallette > Priority: Major > Fix For: 3.6.0, 3.4.13, 3.5.2 > > > In the RangeGlobalStep.java, this line assumes that RangeGlobalStep will be > the last step in the traversal. Due to this assumption, it closes the > traversal when it has no results to share. > This assumption is not true since a limit() step can be put anywhere in the > middle of the query e.g. `g.V().limit(2).out()` > Due to this behaviour, a query such as > `g.V().limit(2).aggregate('x').cap('x').unfold().out()` will execute the last > out() step with a "closed traversal". Let's dry run this query: > The traversal blocks at aggregate barrier step and tries to fetch all > possible incoming solutions till the aggregate step. limit() will provide 2 > solutions and on the third solution, it will close the traversal and return a > NoElementFoundException to downstream steps. aggregate() will consider > NoElementFoundException as a signal for "no more upstream results" and will > aggregate the two solutions. These two solutions will be forwarded to out() > step for computation. BUT limit() has already closed the traversal. And > hence, out() should not be able to execute. > This inconsistency is not caught in the tests because the tests are run > against TinkerGraph which will work even if traversal has been closed, hence, > out() step works even if no underlying iterators are present. > Solution: > 1. Remove the line that closes the traversal here: > [https://github.com/apache/tinkerpop/blame/master/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java#L68] > (along with the incorrect comment) > 2. Add a lifecycle state in the steps. Every step should validate that it is > not closed before execution of each result. If it is closed, steps should > throw a IllegalStateException. > 3. Enhance TinkerGraph to add a concept of open/closed iterators. Ideally, > since the iterators were closed on traversal close, out() should not have > processed successfully in our test cases -- This message was sent by Atlassian Jira (v8.20.1#820001)