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