From f39a44412066f06f1b1a733e6992b4c9e9fea978 Mon Sep 17 00:00:00 2001 From: Jason Lowe Date: Wed, 6 Sep 2017 16:04:30 -0500 Subject: [PATCH] HADOOP-14827. Allow StopWatch to accept a Timer parameter for tests. Contributed by Erik Krogen (cherry picked from commit dd814946f68d52a9b1627ac4dd61f9ab093423ae) --- .../java/org/apache/hadoop/util/StopWatch.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/StopWatch.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/StopWatch.java index b9d0d0b6646..c0eedf6110d 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/StopWatch.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/StopWatch.java @@ -25,11 +25,22 @@ import java.util.concurrent.TimeUnit; * A simplified StopWatch implementation which can measure times in nanoseconds. */ public class StopWatch implements Closeable { + private final Timer timer; private boolean isStarted; private long startNanos; private long currentElapsedNanos; public StopWatch() { + this(new Timer()); + } + + /** + * Used for tests to be able to create a StopWatch which does not follow real + * time. + * @param timer The timer to base this StopWatch's timekeeping off of. + */ + public StopWatch(Timer timer) { + this.timer = timer; } /** @@ -49,7 +60,7 @@ public class StopWatch implements Closeable { throw new IllegalStateException("StopWatch is already running"); } isStarted = true; - startNanos = System.nanoTime(); + startNanos = timer.monotonicNowNanos(); return this; } @@ -61,7 +72,7 @@ public class StopWatch implements Closeable { if (!isStarted) { throw new IllegalStateException("StopWatch is already stopped"); } - long now = System.nanoTime(); + long now = timer.monotonicNowNanos(); isStarted = false; currentElapsedNanos += now - startNanos; return this; @@ -90,7 +101,7 @@ public class StopWatch implements Closeable { */ public long now() { return isStarted ? - System.nanoTime() - startNanos + currentElapsedNanos : + timer.monotonicNowNanos() - startNanos + currentElapsedNanos : currentElapsedNanos; }