You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2017/07/11 12:45:52 UTC
[43/50] [abbrv] tinkerpop git commit: TINKERPOP-1686 Minor tweaks to
finalize MutableMetrics
TINKERPOP-1686 Minor tweaks to finalize MutableMetrics
MutableMetrics attached to DefaultTraversalMetrics should not keep getting stuff written to them after the DefaultTraversalMetrics have been finalized.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/f5ffa0d8
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/f5ffa0d8
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/f5ffa0d8
Branch: refs/heads/TINKERPOP-1686
Commit: f5ffa0d8237668613dade85c19b51bf285e6d72e
Parents: a8ce816
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Wed Jun 7 13:42:56 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Tue Jul 11 08:00:57 2017 -0400
----------------------------------------------------------------------
.../traversal/util/DefaultTraversalMetrics.java | 7 +++-
.../process/traversal/util/MutableMetrics.java | 41 ++++++++++++++++----
2 files changed, 38 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f5ffa0d8/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
index df24932..291c7ea 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
@@ -103,6 +103,9 @@ public final class DefaultTraversalMetrics implements TraversalMetrics, Serializ
return this.computedMetrics.values();
}
+ /**
+ * The metrics have been computed and can no longer be modified.
+ */
public boolean isFinalized() {
return finalized;
}
@@ -131,7 +134,7 @@ public final class DefaultTraversalMetrics implements TraversalMetrics, Serializ
* metrics such that their values can no longer be modified.
*/
public synchronized void setMetrics(final Traversal.Admin traversal, final boolean onGraphComputer) {
- if (finalized) throw new IllegalStateException("Metrics have been finalized");
+ if (finalized) throw new IllegalStateException("Metrics have been finalized and cannot be modified");
finalized = true;
addTopLevelMetrics(traversal, onGraphComputer);
handleNestedTraversals(traversal, null, onGraphComputer);
@@ -280,7 +283,7 @@ public final class DefaultTraversalMetrics implements TraversalMetrics, Serializ
if (null != metrics) { // this happens when a particular branch never received a .next() call (the metrics were never initialized)
if (!onGraphComputer) {
// subtract upstream duration.
- long durBeforeAdjustment = metrics.getDuration(TimeUnit.NANOSECONDS);
+ final long durBeforeAdjustment = metrics.getDuration(TimeUnit.NANOSECONDS);
// adjust duration
metrics.setDuration(metrics.getDuration(TimeUnit.NANOSECONDS) - prevDur, TimeUnit.NANOSECONDS);
prevDur = durBeforeAdjustment;
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f5ffa0d8/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java
index 47decf1..34fa370 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java
@@ -18,6 +18,8 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.util;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Profiling;
+
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@@ -33,6 +35,11 @@ public class MutableMetrics extends ImmutableMetrics implements Cloneable {
private long tempTime = -1L;
+ /**
+ * Determines if metrics have been finalized, meaning that no more may be collected.
+ */
+ private volatile boolean finalized = false;
+
protected MutableMetrics() {
// necessary for gryo serialization
}
@@ -55,10 +62,12 @@ public class MutableMetrics extends ImmutableMetrics implements Cloneable {
}
public void addNested(final MutableMetrics metrics) {
+ if (finalized) throw new IllegalStateException("Metrics have been finalized and cannot be modified");
this.nested.put(metrics.getId(), metrics);
}
public void start() {
+ if (finalized) throw new IllegalStateException("Metrics have been finalized and cannot be modified");
if (-1 != this.tempTime) {
throw new IllegalStateException("Internal Error: Concurrent Metrics start. Stop timer before starting timer.");
}
@@ -66,6 +75,7 @@ public class MutableMetrics extends ImmutableMetrics implements Cloneable {
}
public void stop() {
+ if (finalized) throw new IllegalStateException("Metrics have been finalized and cannot be modified");
if (-1 == this.tempTime)
throw new IllegalStateException("Internal Error: Metrics has not been started. Start timer before stopping timer");
this.durationNs = this.durationNs + (System.nanoTime() - this.tempTime);
@@ -73,6 +83,7 @@ public class MutableMetrics extends ImmutableMetrics implements Cloneable {
}
public void incrementCount(final String key, final long incr) {
+ if (finalized) throw new IllegalStateException("Metrics have been finalized and cannot be modified");
AtomicLong count = this.counts.get(key);
if (count == null) {
count = new AtomicLong();
@@ -82,14 +93,17 @@ public class MutableMetrics extends ImmutableMetrics implements Cloneable {
}
public void setDuration(final long dur, final TimeUnit unit) {
+ if (finalized) throw new IllegalStateException("Metrics have been finalized and cannot be modified");
this.durationNs = TimeUnit.NANOSECONDS.convert(dur, unit);
}
public void setCount(final String key, final long val) {
+ if (finalized) throw new IllegalStateException("Metrics have been finalized and cannot be modified");
this.counts.put(key, new AtomicLong(val));
}
public void aggregate(final MutableMetrics other) {
+ if (finalized) throw new IllegalStateException("Metrics have been finalized and cannot be modified");
this.durationNs += other.durationNs;
for (Map.Entry<String, AtomicLong> otherCount : other.counts.entrySet()) {
AtomicLong thisCount = this.counts.get(otherCount.getKey());
@@ -114,12 +128,11 @@ public class MutableMetrics extends ImmutableMetrics implements Cloneable {
}
} else {
// Numbers are summed
- Number existingNum = (Number) existingVal;
- Number otherNum = (Number) p.getValue();
+ final Number existingNum = (Number) existingVal;
+ final Number otherNum = (Number) p.getValue();
Number newVal;
if (existingNum instanceof Double || existingNum instanceof Float) {
- newVal =
- existingNum.doubleValue() + otherNum.doubleValue();
+ newVal = existingNum.doubleValue() + otherNum.doubleValue();
} else {
newVal = existingNum.longValue() + otherNum.longValue();
}
@@ -145,11 +158,9 @@ public class MutableMetrics extends ImmutableMetrics implements Cloneable {
/**
* Set an annotation value. Support exists for Strings and Numbers only. During a merge, Strings are concatenated
* into a "," (comma) separated list of distinct values (duplicates are ignored), and Numbers are summed.
- *
- * @param key
- * @param value
*/
public void setAnnotation(final String key, final Object value) {
+ if (finalized) throw new IllegalStateException("Metrics have been finalized and cannot be modified");
if (!(value instanceof String) && !(value instanceof Number)) {
throw new IllegalArgumentException("Metrics annotations only support String and Number values.");
}
@@ -161,7 +172,21 @@ public class MutableMetrics extends ImmutableMetrics implements Cloneable {
return (MutableMetrics) nested.get(metricsId);
}
- public ImmutableMetrics getImmutableClone() {
+ /**
+ * Once these metrics are used in computing the final metrics to report through {@link TraversalMetrics} they
+ * should no longer be modified and are thus finalized.
+ */
+ public boolean isFinalized() {
+ return finalized;
+ }
+
+ /**
+ * Gets a copy of the metrics that is immutable. Once this clone is made, the {@link MutableMetrics} can no
+ * longer be modified themselves. This prevents custom steps that implement {@link Profiling} from adding to
+ * the metrics after the traversal is complete.
+ */
+ public synchronized ImmutableMetrics getImmutableClone() {
+ finalized = true;
final ImmutableMetrics clone = new ImmutableMetrics();
copyMembers(clone);
this.nested.values().forEach(nested -> clone.nested.put(nested.id, ((MutableMetrics) nested).getImmutableClone()));