Repository: tinkerpop Updated Branches: refs/heads/TINKERPOP-1489 468bba639 -> 6a0193f1d (forced update)
TINKERPOP-1801: fix profile() timing in OLAP by adding worker iteration timings to step metrics this is a simple fix that do not change any API Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/a9ca781f Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/a9ca781f Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/a9ca781f Branch: refs/heads/TINKERPOP-1489 Commit: a9ca781f8c44c74a30ca475d6b6f0579ae4abb00 Parents: 909cd91 Author: artemaliev <artem.aliev@gmail,com> Authored: Tue Oct 17 21:00:31 2017 +0300 Committer: artemaliev <artem.aliev@gmail,com> Committed: Mon Oct 30 16:18:15 2017 +0300 ---------------------------------------------------------------------- .../traversal/TraversalVertexProgram.java | 39 ++++++++++++++++++++ 1 file changed, 39 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a9ca781f/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java index f72f49b..7472b85 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java @@ -55,10 +55,12 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.Halted import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ComputerVerificationStrategy; import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet; import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal; +import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics; import org.apache.tinkerpop.gremlin.process.traversal.util.PureTraversal; import org.apache.tinkerpop.gremlin.process.traversal.util.ScriptTraversal; import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper; import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMatrix; +import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics; import org.apache.tinkerpop.gremlin.structure.Direction; import org.apache.tinkerpop.gremlin.structure.Element; import org.apache.tinkerpop.gremlin.structure.Graph; @@ -75,6 +77,7 @@ import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Optional; import java.util.Set; @@ -111,6 +114,10 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet< private TraverserSet<Object> haltedTraversers; private boolean returnHaltedTraversers = false; private HaltedTraverserStrategy haltedTraverserStrategy; + private boolean profile = false; + // handle current profile metrics if profile is true + private MutableMetrics iterationMetrics; + private TraversalVertexProgram() { } @@ -194,6 +201,9 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet< this.memoryComputeKeys.add(MemoryComputeKey.of(ACTIVE_TRAVERSERS, Operator.addAll, true, true)); this.memoryComputeKeys.add(MemoryComputeKey.of(MUTATED_MEMORY_KEYS, Operator.addAll, false, true)); this.memoryComputeKeys.add(MemoryComputeKey.of(COMPLETED_BARRIERS, Operator.addAll, true, true)); + + // does the traversal need profile information + this.profile = !TraversalHelper.getStepsOfAssignableClassRecursively(ProfileStep.class, this.traversal.get()).isEmpty(); } @Override @@ -229,6 +239,8 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet< } // local variable will no longer be used so null it for GC this.haltedTraversers = null; + // does the traversal need profile information + this.profile = !TraversalHelper.getStepsOfAssignableClassRecursively(ProfileStep.class, this.traversal.get()).isEmpty(); } @Override @@ -343,6 +355,33 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet< } @Override + public void workerIterationStart(final Memory memory) { + // start collecting profile metrics + if (this.profile) { + iterationMetrics = new MutableMetrics("iteration" + memory.getIteration(), + "Worker Iteration " + memory.getIteration()); + iterationMetrics.start(); + } + } + + @Override + public void workerIterationEnd(final Memory memory) { + // store profile metrics in proper ProfileStep metrics + if (this.profile) { + List<ProfileStep> profileSteps = TraversalHelper.getStepsOfAssignableClassRecursively(ProfileStep.class, this.traversal.get()); + // guess the profile step to store data + int profileStepIndex = memory.getIteration(); + // if we guess wrongly write timing into last step + profileStepIndex = profileStepIndex >= profileSteps.size() ? profileSteps.size() - 1 : profileStepIndex; + iterationMetrics.finish(0); + // reset counts + iterationMetrics.setCount(TraversalMetrics.TRAVERSER_COUNT_ID,0); + this.traversal.get().getSideEffects().add(profileSteps.get(profileStepIndex).getId(), iterationMetrics); + iterationMetrics = null; + } + } + + @Override public Set<VertexComputeKey> getVertexComputeKeys() { return VERTEX_COMPUTE_KEYS; }