diff options
author | jonmv <venstad@gmail.com> | 2023-07-07 13:28:50 +0200 |
---|---|---|
committer | jonmv <venstad@gmail.com> | 2023-07-07 13:28:50 +0200 |
commit | b3f69492a602cb150df8b764875e6597055288ea (patch) | |
tree | 9ead503a79b28e6564658a08027c32563f4491ac /vespajlib | |
parent | 5b4fa659348100f093e72e86b2e0528bae649cad (diff) |
Avoid overflow for 146 years of JVM time for common timers
Diffstat (limited to 'vespajlib')
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/concurrent/SystemTimer.java | 23 | ||||
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/concurrent/Timer.java | 4 |
2 files changed, 12 insertions, 15 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/concurrent/SystemTimer.java b/vespajlib/src/main/java/com/yahoo/concurrent/SystemTimer.java index 8111d52a10f..9bb320ad0a9 100644 --- a/vespajlib/src/main/java/com/yahoo/concurrent/SystemTimer.java +++ b/vespajlib/src/main/java/com/yahoo/concurrent/SystemTimer.java @@ -42,21 +42,18 @@ public enum SystemTimer implements Timer { SystemTimer() { long napTime = adjustTimeoutByDetectedHz(Duration.ofMillis(1)).toMillis(); - millis = TimeUnit.NANOSECONDS.toMillis(System.nanoTime()); - Thread thread = new Thread() { - - @Override - public void run() { - while (true) { - millis = TimeUnit.NANOSECONDS.toMillis(System.nanoTime()); - try { - Thread.sleep(napTime); - } catch (InterruptedException e) { - break; - } + long creationNanos = System.nanoTime(); + millis = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - creationNanos); + Thread thread = new Thread(() -> { + while (true) { + millis = TimeUnit.NANOSECONDS.toMillis(System.nanoTime()) - creationNanos; + try { + Thread.sleep(napTime); + } catch (InterruptedException e) { + break; } } - }; + }); thread.setDaemon(true); thread.setName("vespa-system-timer"); thread.start(); diff --git a/vespajlib/src/main/java/com/yahoo/concurrent/Timer.java b/vespajlib/src/main/java/com/yahoo/concurrent/Timer.java index c41c762c989..46d72f6d5ad 100644 --- a/vespajlib/src/main/java/com/yahoo/concurrent/Timer.java +++ b/vespajlib/src/main/java/com/yahoo/concurrent/Timer.java @@ -20,7 +20,8 @@ public interface Timer { * @return The current value of the timer, in milliseconds. */ long milliTime(); - Timer monotonic = () -> TimeUnit.NANOSECONDS.toMillis(System.nanoTime()); + long creationNanos = System.nanoTime(); // Avoid monotonic timer overflow for the first 146 years of JVM uptime. + Timer monotonic = () -> TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - creationNanos); static Timer wrap(Clock original) { return new Timer() { private final Clock clock = original; @@ -30,6 +31,5 @@ public interface Timer { return clock.millis(); } }; } - default Instant instant() { return Instant.ofEpochMilli(milliTime()); } } |