moved the bulking logic for GremlinServer into TraverserIterator. Basically, at 
the point of returning traversers over the network, try and bulk as many as you 
can to reduce traffic.


Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/b635c801
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/b635c801
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/b635c801

Branch: refs/heads/TINKERPOP-1599
Commit: b635c801d07aca4d9b62e962f5bf9b2326b732cf
Parents: 080306b
Author: Marko A. Rodriguez <okramma...@gmail.com>
Authored: Thu Feb 16 08:35:51 2017 -0700
Committer: Marko A. Rodriguez <okramma...@gmail.com>
Committed: Thu Feb 16 08:35:51 2017 -0700

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  2 +-
 .../strategy/decoration/RemoteStrategy.java     |  7 -------
 .../gremlin/server/util/TraverserIterator.java  | 21 +++++++++++++++++---
 3 files changed, 19 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/b635c801/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index cf7312e..30fb41e 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -27,7 +27,7 @@ TinkerPop 3.2.5 (Release Date: NOT OFFICIALLY RELEASED YET)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 * Fixed an optimization bug in `LazyBarrierStrategy` around appending barriers 
to the end of a `Traversal`.
-* `RemoteStrategy` is smart to try and append a `NoOpBarrierStep` in order to 
bulk traversers prior to network I/O.
+* `TraverserIterator` in GremlinServer is smart to try and bulk traversers 
prior to network I/O.
 
 [[release-3-2-4]]
 TinkerPop 3.2.4 (Release Date: February 8, 2017)

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/b635c801/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/strategy/decoration/RemoteStrategy.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/strategy/decoration/RemoteStrategy.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/strategy/decoration/RemoteStrategy.java
index 14d3b36..d1b14d5 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/strategy/decoration/RemoteStrategy.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/strategy/decoration/RemoteStrategy.java
@@ -24,8 +24,6 @@ import 
org.apache.tinkerpop.gremlin.process.remote.RemoteGraph;
 import 
org.apache.tinkerpop.gremlin.process.remote.traversal.step.map.RemoteStep;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Barrier;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.NoOpBarrierStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
@@ -49,7 +47,6 @@ public final class RemoteStrategy extends 
AbstractTraversalStrategy<TraversalStr
         implements TraversalStrategy.DecorationStrategy {
 
     private static final RemoteStrategy INSTANCE = new RemoteStrategy();
-    protected static final int MAX_BARRIER_SIZE = 1000;
     private final Optional<RemoteConnection> remoteConnection;
 
     private static final Set<Class<? extends DecorationStrategy>> POSTS = 
Collections.singleton(VertexProgramStrategy.class);
@@ -92,10 +89,6 @@ public final class RemoteStrategy extends 
AbstractTraversalStrategy<TraversalStr
         if (!(traversal.getParent() instanceof EmptyStep))
             return;
 
-        // given that we send traversers over the wire, try our best to bulk 
to limit network traffic
-        if (!(traversal.getEndStep() instanceof Barrier))
-            traversal.addStep(new NoOpBarrierStep<>(traversal, 
MAX_BARRIER_SIZE));
-
         // verifications to ensure unsupported steps do not exist in the 
traversal
         if (Boolean.valueOf(System.getProperty("is.testing", "false")) &&
                 
(TraversalHelper.hasStepOfAssignableClassRecursively(ProfileSideEffectStep.class,
 traversal) ||

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/b635c801/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/TraverserIterator.java
----------------------------------------------------------------------
diff --git 
a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/TraverserIterator.java
 
b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/TraverserIterator.java
index d4bf5c0..8ea6e55 100644
--- 
a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/TraverserIterator.java
+++ 
b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/util/TraverserIterator.java
@@ -22,6 +22,8 @@ import 
org.apache.tinkerpop.gremlin.process.remote.traversal.DefaultRemoteTraver
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.HaltedTraverserStrategy;
+import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
 
 import java.util.Iterator;
 
@@ -32,9 +34,12 @@ public class TraverserIterator implements Iterator<Object> {
 
     private final Traversal.Admin traversal;
     private final HaltedTraverserStrategy haltedTraverserStrategy;
+    private final TraverserSet bulker = new TraverserSet();
+    private final int barrierSize;
 
     public TraverserIterator(final Traversal.Admin traversal) {
         this.traversal = traversal;
+        this.barrierSize = 
traversal.getTraverserRequirements().contains(TraverserRequirement.ONE_BULK) ? 
1 : 1000;
         this.haltedTraverserStrategy = 
traversal.getStrategies().getStrategy(HaltedTraverserStrategy.class).orElse(
                 Boolean.valueOf(System.getProperty("is.testing", "false")) ?
                         HaltedTraverserStrategy.detached() :
@@ -42,17 +47,27 @@ public class TraverserIterator implements Iterator<Object> {
     }
 
     public Traversal.Admin getTraversal() {
-        return traversal;
+        return this.traversal;
     }
 
     @Override
     public boolean hasNext() {
-        return this.traversal.hasNext();
+        if (this.bulker.isEmpty())
+            this.fillBulker();
+        return !this.bulker.isEmpty();
     }
 
     @Override
     public Object next() {
-        final Traverser.Admin t = 
this.haltedTraverserStrategy.halt(traversal.nextTraverser());
+        if (this.bulker.isEmpty())
+            this.fillBulker();
+        final Traverser.Admin t = 
this.haltedTraverserStrategy.halt(this.bulker.remove());
         return new DefaultRemoteTraverser<>(t.get(), t.bulk());
     }
+
+    private final void fillBulker() {
+        while (this.traversal.hasNext() && this.bulker.size() < 
this.barrierSize) {
+            this.bulker.add(this.traversal.nextTraverser());
+        }
+    }
 }
\ No newline at end of file

Reply via email to