From a51916447efc05c7e7ade68f035261b864d27503 Mon Sep 17 00:00:00 2001 From: franz1981 Date: Thu, 3 Mar 2022 16:46:28 +0100 Subject: [PATCH] ARTEMIS-3522 Improve next fire time computation using double period --- .../perf/ProducerTargetRateLoadGenerator.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/messages/perf/ProducerTargetRateLoadGenerator.java b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/messages/perf/ProducerTargetRateLoadGenerator.java index 3310a02491..63a3dd239d 100644 --- a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/messages/perf/ProducerTargetRateLoadGenerator.java +++ b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/messages/perf/ProducerTargetRateLoadGenerator.java @@ -16,7 +16,6 @@ */ package org.apache.activemq.artemis.cli.commands.messages.perf; -import java.util.concurrent.TimeUnit; import java.util.function.BooleanSupplier; import io.netty.util.concurrent.OrderedEventExecutor; @@ -24,7 +23,9 @@ import org.HdrHistogram.SingleWriterRecorder; public final class ProducerTargetRateLoadGenerator extends SkeletalProducerLoadGenerator { - private final long usPeriod; + private final double usPeriod; + private long startLoadMicros; + private long fireCount; private long fireTimeMicros; private boolean started; @@ -39,7 +40,7 @@ public final class ProducerTargetRateLoadGenerator extends SkeletalProducerLoadG final SingleWriterRecorder waitLatencies) { super(producer, executor, timeProvider, keepOnSending, group, msgContent, sendCompletedLatencies, waitLatencies); this.fireTimeMicros = 0; - this.usPeriod = TimeUnit.NANOSECONDS.toMicros(nsPeriod); + this.usPeriod = nsPeriod / 1000d; this.started = false; } @@ -51,6 +52,7 @@ public final class ProducerTargetRateLoadGenerator extends SkeletalProducerLoadG final long now = timeProvider.now(); if (!started) { started = true; + startLoadMicros = now; fireTimeMicros = now; } if (!trySend(fireTimeMicros, now)) { @@ -61,7 +63,8 @@ public final class ProducerTargetRateLoadGenerator extends SkeletalProducerLoadG stopLoad = true; return; } - fireTimeMicros += usPeriod; + fireCount++; + fireTimeMicros = startLoadMicros + (long) (fireCount * usPeriod); final long delay = fireTimeMicros - timeProvider.now(); final long usToNextFireTime = Math.max(0, delay); asyncContinue(usToNextFireTime);