Repository: tinkerpop Updated Branches: refs/heads/TINKERPOP-1627 080306b09 -> b635c801d
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-1627 Commit: b635c801d07aca4d9b62e962f5bf9b2326b732cf Parents: 080306b Author: Marko A. Rodriguez <[email protected]> Authored: Thu Feb 16 08:35:51 2017 -0700 Committer: Marko A. Rodriguez <[email protected]> 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
