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/0a823579 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/0a823579 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/0a823579 Branch: refs/heads/TINKERPOP-1564 Commit: 0a8235793c3ced7919be745e5d8f356b672728f2 Parents: 53e932b Author: Stephen Mallette <sp...@genoprime.com> Authored: Thu Dec 8 09:18:56 2016 -0500 Committer: Stephen Mallette <sp...@genoprime.com> Committed: Thu Dec 8 09:18:56 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/0a823579/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/0a823579/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);