Minor fix to iteration completion logic Had to store the value of hasNext() as some graphs may open a new transaction on such calls and leave it hanging. CTR
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/966df989 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/966df989 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/966df989 Branch: refs/heads/TINKERPOP-1490 Commit: 966df98921e42a2918ea9f676ac2ad3a3027d64f Parents: 595cf3b Author: Stephen Mallette <[email protected]> Authored: Thu Dec 8 09:18:56 2016 -0500 Committer: Stephen Mallette <[email protected]> Committed: Thu Dec 8 09:21:24 2016 -0500 ---------------------------------------------------------------------- .../tinkerpop/gremlin/server/op/AbstractOpProcessor.java | 9 +++++++-- .../gremlin/server/op/traversal/TraversalOpProcessor.java | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/966df989/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractOpProcessor.java ---------------------------------------------------------------------- diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractOpProcessor.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractOpProcessor.java index 5482de1..c3ac475 100644 --- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractOpProcessor.java +++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractOpProcessor.java @@ -154,9 +154,14 @@ public abstract class AbstractOpProcessor implements OpProcessor { break; } + // track whether there is anything left in the iterator because it needs to be accessed after + // the transaction could be closed - in that case a call to hasNext() could open a new transaction + // unintentionally + final boolean moreInIterator = itty.hasNext(); + try { // only need to reset the aggregation list if there's more stuff to write - if (itty.hasNext()) + if (moreInIterator) aggregate = new ArrayList<>(resultIterationBatchSize); else { // iteration and serialization are both complete which means this finished successfully. note that @@ -179,7 +184,7 @@ public abstract class AbstractOpProcessor implements OpProcessor { throw ex; } - if (!itty.hasNext()) iterateComplete(ctx, msg, itty); + if (!moreInIterator) iterateComplete(ctx, msg, itty); // the flush is called after the commit has potentially occurred. in this way, if a commit was // required then it will be 100% complete before the client receives it. the "frame" at this point http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/966df989/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java ---------------------------------------------------------------------- diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java index 5edbe26..5461007 100644 --- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java +++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java @@ -110,7 +110,7 @@ public class TraversalOpProcessor extends AbstractOpProcessor { }}; } - private static Cache<UUID, TraversalSideEffects> cache = null; + protected static Cache<UUID, TraversalSideEffects> cache = null; public TraversalOpProcessor() { super(false);
