summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2022-02-25 13:27:09 +0100
committerHenning Baldersheim <balder@yahoo-inc.com>2022-02-25 14:24:26 +0100
commita40709e319105f33a81eeec0dce09572fe45ecb7 (patch)
treef59e29066e5fde7e056a06afe2e35a171df46155
parentd69aeb4ee39c352c87336e617f5d73c58b2faeb8 (diff)
Use a typesafe Duration instead of integer milliseondst status.
-rw-r--r--config-proxy/src/main/java/com/yahoo/vespa/config/proxy/RpcConfigSourceClient.java3
-rw-r--r--messagebus/src/main/java/com/yahoo/messagebus/MessageBus.java4
-rwxr-xr-xmessagebus/src/main/java/com/yahoo/messagebus/Messenger.java3
-rw-r--r--vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java2
-rw-r--r--vespajlib/src/main/java/com/yahoo/concurrent/SystemTimer.java14
-rw-r--r--vespajlib/src/test/java/com/yahoo/concurrent/ExecutorsTestCase.java27
6 files changed, 43 insertions, 10 deletions
diff --git a/config-proxy/src/main/java/com/yahoo/vespa/config/proxy/RpcConfigSourceClient.java b/config-proxy/src/main/java/com/yahoo/vespa/config/proxy/RpcConfigSourceClient.java
index 5ca387b6122..f022ed11f3d 100644
--- a/config-proxy/src/main/java/com/yahoo/vespa/config/proxy/RpcConfigSourceClient.java
+++ b/config-proxy/src/main/java/com/yahoo/vespa/config/proxy/RpcConfigSourceClient.java
@@ -17,6 +17,7 @@ import com.yahoo.vespa.config.RawConfig;
import com.yahoo.vespa.config.TimingValues;
import com.yahoo.vespa.config.protocol.JRTServerConfigRequest;
+import java.time.Duration;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@@ -68,7 +69,7 @@ class RpcConfigSourceClient implements ConfigSourceClient, Runnable {
this.memoryCache = new MemoryCache();
this.delayedResponses = new DelayedResponses();
checkConfigSources();
- nextConfigFuture = nextConfigScheduler.scheduleAtFixedRate(this, 0, SystemTimer.adjustTimeoutByDetectedHz(10), MILLISECONDS);
+ nextConfigFuture = nextConfigScheduler.scheduleAtFixedRate(this, 0, SystemTimer.adjustTimeoutByDetectedHz(Duration.ofMillis(10)).toMillis(), MILLISECONDS);
this.requesters = new JrtConfigRequesters();
DelayedResponseHandler command = new DelayedResponseHandler(delayedResponses, memoryCache, responseHandler);
this.delayedResponsesFuture = delayedResponsesScheduler.scheduleAtFixedRate(command, 5, 1, SECONDS);
diff --git a/messagebus/src/main/java/com/yahoo/messagebus/MessageBus.java b/messagebus/src/main/java/com/yahoo/messagebus/MessageBus.java
index c47fe88dc71..c3279d994c9 100644
--- a/messagebus/src/main/java/com/yahoo/messagebus/MessageBus.java
+++ b/messagebus/src/main/java/com/yahoo/messagebus/MessageBus.java
@@ -2,6 +2,8 @@
package com.yahoo.messagebus;
import com.yahoo.concurrent.SystemTimer;
+
+import java.time.Duration;
import java.util.logging.Level;
import com.yahoo.messagebus.network.Network;
import com.yahoo.messagebus.network.NetworkMultiplexer;
@@ -88,7 +90,7 @@ public class MessageBus implements ConfigHandler, NetworkOwner, MessageHandler,
}
private void sendBlockedMessages() {
- int timeout = SystemTimer.adjustTimeoutByDetectedHz(10);
+ long timeout = SystemTimer.adjustTimeoutByDetectedHz(Duration.ofMillis(10)).toMillis();
while (! destroyed.get()) {
for (SendBlockedMessages sender : blockedSenders.keySet()) {
if (!sender.trySend()) {
diff --git a/messagebus/src/main/java/com/yahoo/messagebus/Messenger.java b/messagebus/src/main/java/com/yahoo/messagebus/Messenger.java
index 4f36cb3b328..871f53396b4 100755
--- a/messagebus/src/main/java/com/yahoo/messagebus/Messenger.java
+++ b/messagebus/src/main/java/com/yahoo/messagebus/Messenger.java
@@ -3,6 +3,7 @@ package com.yahoo.messagebus;
import com.yahoo.concurrent.SystemTimer;
+import java.time.Duration;
import java.util.logging.Level;
import java.util.ArrayDeque;
@@ -149,7 +150,7 @@ public class Messenger implements Runnable {
@Override
public void run() {
- int timeoutMS = SystemTimer.adjustTimeoutByDetectedHz(100);
+ long timeoutMS = SystemTimer.adjustTimeoutByDetectedHz(Duration.ofMillis(100)).toMillis();
while (true) {
Task task = null;
synchronized (this) {
diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java
index 220c61a3442..10e55527a2a 100644
--- a/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java
+++ b/vespaclient-container-plugin/src/main/java/com/yahoo/document/restapi/resource/DocumentV1ApiHandler.java
@@ -212,7 +212,7 @@ public class DocumentV1ApiHandler extends AbstractRequestHandler {
this.asyncSession = access.createAsyncSession(new AsyncParameters());
this.clusters = parseClusters(clusterListConfig, bucketSpacesConfig);
this.operations = new ConcurrentLinkedDeque<>();
- int resendDelayMS = SystemTimer.adjustTimeoutByDetectedHz(executorConfig.resendDelayMillis());
+ long resendDelayMS = SystemTimer.adjustTimeoutByDetectedHz(Duration.ofMillis(executorConfig.resendDelayMillis())).toMillis();
//TODO Here it would be better do have dedicated threads with different wait depending on blocked or empty.
this.dispatcher.scheduleWithFixedDelay(this::dispatchEnqueued, resendDelayMS, resendDelayMS, MILLISECONDS);
diff --git a/vespajlib/src/main/java/com/yahoo/concurrent/SystemTimer.java b/vespajlib/src/main/java/com/yahoo/concurrent/SystemTimer.java
index 38e93db30b6..8111d52a10f 100644
--- a/vespajlib/src/main/java/com/yahoo/concurrent/SystemTimer.java
+++ b/vespajlib/src/main/java/com/yahoo/concurrent/SystemTimer.java
@@ -1,6 +1,7 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.concurrent;
+import java.time.Duration;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -16,10 +17,10 @@ public enum SystemTimer implements Timer {
private volatile long millis;
- public static int detectHz() {
+ public static long detectHz() {
Logger log = Logger.getLogger(SystemTimer.class.getName());
String hzEnv = System.getenv("VESPA_TIMER_HZ");
- int hz = 1000;
+ long hz = 1000;
if ((hzEnv != null) && !hzEnv.isBlank()) {
try {
hz = Integer.parseInt(hzEnv);
@@ -32,12 +33,15 @@ public enum SystemTimer implements Timer {
return hz;
}
- public static int adjustTimeoutByDetectedHz(int timeoutMS) {
- return (timeoutMS * 1000)/ detectHz();
+ public static Duration adjustTimeoutByDetectedHz(Duration timeout) {
+ return adjustTimeoutByDetectedHz(timeout, detectHz());
+ }
+ public static Duration adjustTimeoutByDetectedHz(Duration timeout, long hz) {
+ return timeout.multipliedBy(1000).dividedBy(hz);
}
SystemTimer() {
- int napTime = adjustTimeoutByDetectedHz(1);
+ long napTime = adjustTimeoutByDetectedHz(Duration.ofMillis(1)).toMillis();
millis = TimeUnit.NANOSECONDS.toMillis(System.nanoTime());
Thread thread = new Thread() {
diff --git a/vespajlib/src/test/java/com/yahoo/concurrent/ExecutorsTestCase.java b/vespajlib/src/test/java/com/yahoo/concurrent/ExecutorsTestCase.java
index 707445efc5b..0a1bdc51930 100644
--- a/vespajlib/src/test/java/com/yahoo/concurrent/ExecutorsTestCase.java
+++ b/vespajlib/src/test/java/com/yahoo/concurrent/ExecutorsTestCase.java
@@ -8,8 +8,16 @@ import static org.junit.Assert.assertTrue;
import org.junit.Ignore;
import org.junit.Test;
+import java.time.Duration;
import java.util.LinkedList;
-import java.util.concurrent.*;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class ExecutorsTestCase {
@@ -137,4 +145,21 @@ public class ExecutorsTestCase {
assertEquals(9, measureMaxNumThreadsUsage(new ThreadPoolExecutor(100, 100, 0L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(false)), 3000, 10));
Runner.threadCount.set(0);
}
+
+ @Test
+ public void requireHzAndAdjustment() {
+ assertEquals(1000, SystemTimer.detectHz());
+
+ assertEquals(1, SystemTimer.adjustTimeoutByDetectedHz(Duration.ofMillis(1)).toMillis());
+ assertEquals(20, SystemTimer.adjustTimeoutByDetectedHz(Duration.ofMillis(20)).toMillis());
+
+ assertEquals(1, SystemTimer.adjustTimeoutByDetectedHz(Duration.ofMillis(1), 1000).toMillis());
+ assertEquals(10, SystemTimer.adjustTimeoutByDetectedHz(Duration.ofMillis(1), 100).toMillis());
+ assertEquals(100, SystemTimer.adjustTimeoutByDetectedHz(Duration.ofMillis(1), 10).toMillis());
+
+ assertEquals(20, SystemTimer.adjustTimeoutByDetectedHz(Duration.ofMillis(20), 1000).toMillis());
+ assertEquals(200, SystemTimer.adjustTimeoutByDetectedHz(Duration.ofMillis(20), 100).toMillis());
+ assertEquals(2000, SystemTimer.adjustTimeoutByDetectedHz(Duration.ofMillis(20), 10).toMillis());
+ }
+
}