diff options
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()); + } + } |