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

Reply via email to