aboutsummaryrefslogtreecommitdiffstats
path: root/jdisc_core
diff options
context:
space:
mode:
authorHarald Musum <musum@oath.com>2018-06-21 20:37:42 +0200
committerGitHub <noreply@github.com>2018-06-21 20:37:42 +0200
commit12aa9c3f161790b665259910a7c8f41706ba6682 (patch)
treebfaccaef6f0f4cf8052f573656bb57a844eb6cb9 /jdisc_core
parent18b49613b7f2a62281b3275563d8e0b8b284b201 (diff)
Revert "Move TimeBudget to vespajlib and use Clock"
Diffstat (limited to 'jdisc_core')
-rw-r--r--jdisc_core/src/main/java/com/yahoo/jdisc/TimeBudget.java55
-rw-r--r--jdisc_core/src/test/java/com/yahoo/jdisc/TimeBudgetTestCase.java29
2 files changed, 84 insertions, 0 deletions
diff --git a/jdisc_core/src/main/java/com/yahoo/jdisc/TimeBudget.java b/jdisc_core/src/main/java/com/yahoo/jdisc/TimeBudget.java
new file mode 100644
index 00000000000..39322b6e83a
--- /dev/null
+++ b/jdisc_core/src/main/java/com/yahoo/jdisc/TimeBudget.java
@@ -0,0 +1,55 @@
+// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.jdisc;
+
+import javax.annotation.concurrent.Immutable;
+import java.time.Duration;
+import java.time.Instant;
+
+/**
+ * A TimeBudget tracks the current time compared to a start time and deadline.
+ *
+ * @author hakon
+ */
+@Immutable
+public class TimeBudget {
+ private final Timer timer;
+ private final Instant start;
+ private final Duration timeout;
+
+ /** Returns a TimeBudget with a start time of now, and with the given timeout. */
+ public static TimeBudget fromNow(Timer timer, Duration timeout) {
+ return new TimeBudget(timer, timer.currentTime(), timeout);
+ }
+
+ private TimeBudget(Timer timer, Instant start, Duration timeout) {
+ this.timer = timer;
+ this.start = start;
+ this.timeout = timeout;
+ }
+
+ /** Time until 'headroom' before deadline. Guaranteed to be non-negative. */
+ public Duration timeBeforeDeadline(Duration headroom) {
+ return nonNegativeBetween(now(), deadline().minus(headroom));
+ }
+
+ /** Returns the original timeout. */
+ public Duration originalTimeout() {
+ return timeout;
+ }
+
+ private static Duration nonNegativeBetween(Instant start, Instant end) {
+ return makeNonNegative(Duration.between(start, end));
+ }
+
+ private static Duration makeNonNegative(Duration duration) {
+ return duration.isNegative() ? Duration.ZERO : duration;
+ }
+
+ private Instant now() {
+ return timer.currentTime();
+ }
+
+ private Instant deadline() {
+ return start.plus(timeout);
+ }
+}
diff --git a/jdisc_core/src/test/java/com/yahoo/jdisc/TimeBudgetTestCase.java b/jdisc_core/src/test/java/com/yahoo/jdisc/TimeBudgetTestCase.java
new file mode 100644
index 00000000000..5afc205beb3
--- /dev/null
+++ b/jdisc_core/src/test/java/com/yahoo/jdisc/TimeBudgetTestCase.java
@@ -0,0 +1,29 @@
+// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.jdisc;
+
+import org.junit.Test;
+
+import java.time.Duration;
+import java.time.Instant;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class TimeBudgetTestCase {
+ private final Timer timer = mock(Timer.class);
+
+ @Test
+ public void testBasics() {
+ when(timer.currentTime()).thenReturn(Instant.ofEpochSecond(0));
+ TimeBudget timeBudget = TimeBudget.fromNow(timer, Duration.ofSeconds(10));
+
+ when(timer.currentTime()).thenReturn(Instant.ofEpochSecond(7));
+ assertEquals(Duration.ofSeconds(3), timeBudget.timeBeforeDeadline(Duration.ofSeconds(0)));
+ assertEquals(Duration.ofSeconds(1), timeBudget.timeBeforeDeadline(Duration.ofSeconds(2)));
+ assertEquals(Duration.ofSeconds(0), timeBudget.timeBeforeDeadline(Duration.ofSeconds(5)));
+
+ when(timer.currentTime()).thenReturn(Instant.ofEpochSecond(11));
+ assertEquals(Duration.ofSeconds(0), timeBudget.timeBeforeDeadline(Duration.ofSeconds(0)));
+ }
+} \ No newline at end of file