You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by fs...@apache.org on 2019/09/07 13:25:10 UTC

[jmeter] 02/02: Revert behaviour of TimerService#adjustDelay to that of 5.1.1

This is an automated email from the ASF dual-hosted git repository.

fschumacher pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jmeter.git

commit f2c5260abe7a3e1022793474c0a1e322dd0a2010
Author: Felix Schumacher <fe...@internetallee.de>
AuthorDate: Sat Sep 7 15:20:24 2019 +0200

    Revert behaviour of TimerService#adjustDelay to that of 5.1.1
    
    Changing the adjustDelay method to return -1 when the delay would be longer
    than the remaining scheduled duration, lead to bug 63711.
    
    This change reverts the default adjustDelay to the old behaviour and adds a
    flag to enable the "new" feature of returning -1 when the sleep time would
    be too long.
    
    Bugzilla Id: 63711
---
 .../org/apache/jmeter/timers/TimerServiceTest.java | 33 +++++++++++++++-
 .../org/apache/jmeter/threads/JMeterThread.java    |  3 +-
 .../org/apache/jmeter/timers/TimerService.java     | 46 +++++++++++++++++++---
 3 files changed, 74 insertions(+), 8 deletions(-)

diff --git a/src/components/src/test/java/org/apache/jmeter/timers/TimerServiceTest.java b/src/components/src/test/java/org/apache/jmeter/timers/TimerServiceTest.java
index 428efd2..0c46662 100644
--- a/src/components/src/test/java/org/apache/jmeter/timers/TimerServiceTest.java
+++ b/src/components/src/test/java/org/apache/jmeter/timers/TimerServiceTest.java
@@ -18,7 +18,9 @@
 
 package org.apache.jmeter.timers;
 
+import org.hamcrest.BaseMatcher;
 import org.hamcrest.CoreMatchers;
+import org.hamcrest.Description;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -27,14 +29,41 @@ public class TimerServiceTest {
     TimerService sut = TimerService.getInstance();
 
     @Test
-    public void testBigInitialDelay() {
+    public void testBigInitialDelayAndDontWait() {
         long now = System.currentTimeMillis();
-        long adjustedDelay = sut.adjustDelay(Long.MAX_VALUE, now + 1000L);
+        long adjustedDelay = sut.adjustDelay(Long.MAX_VALUE, now + 1000L, false);
         Assert.assertThat("TimerService should return -1 as delay would lead to a time after end time",
                 Long.valueOf(adjustedDelay), CoreMatchers.is(Long.valueOf(-1)));
     }
 
     @Test
+    public void testBigInitialDelayAndWait() {
+        long now = System.currentTimeMillis();
+        long adjustedDelay = sut.adjustDelay(Long.MAX_VALUE, now + 1000L);
+        Assert.assertThat("TimerService should return -1 as delay would lead to a time after end time",
+                Long.valueOf(adjustedDelay), isAlmost(1000L, 200L));
+    }
+
+    private BaseMatcher<Long> isAlmost(long value, long precision) {
+        return new BaseMatcher<Long>() {
+
+            @Override
+            public boolean matches(Object item) {
+                if (item instanceof Long) {
+                    Long other = (Long) item;
+                    return Math.abs(other.longValue() - value) < precision;
+                }
+                return false;
+            }
+
+            @Override
+            public void describeTo(Description description) {
+                description.appendText("the number is within a precision of " + precision + " near " + value);
+            }
+      };
+    }
+
+    @Test
     public void testSmallInitialDelay() {
         long now = System.currentTimeMillis();
         Assert.assertThat("TimerService should not change the delay as the end time is far away",
diff --git a/src/core/src/main/java/org/apache/jmeter/threads/JMeterThread.java b/src/core/src/main/java/org/apache/jmeter/threads/JMeterThread.java
index 258c901..6fc1194 100644
--- a/src/core/src/main/java/org/apache/jmeter/threads/JMeterThread.java
+++ b/src/core/src/main/java/org/apache/jmeter/threads/JMeterThread.java
@@ -494,6 +494,7 @@ public class JMeterThread implements Runnable, Interruptible {
                 // checks the scheduler to stop the iteration
                 stopSchedulerIfNeeded();
             }
+
         } catch (JMeterStopTestException e) { // NOSONAR
             if (log.isInfoEnabled()) {
                 log.info("Stopping Test: {}", e.toString());
@@ -969,7 +970,7 @@ public class JMeterThread implements Runnable, Interruptible {
                 if (scheduler) {
                     // We reduce pause to ensure end of test is not delayed by a sleep ending after test scheduled end
                     // See Bug 60049
-                    totalDelay = TIMER_SERVICE.adjustDelay(totalDelay, endTime);
+                    totalDelay = TIMER_SERVICE.adjustDelay(totalDelay, endTime, false);
                     if (totalDelay < 0) {
                         log.debug("The delay would be longer than the scheduled period, so stop thread now.");
                         running = false;
diff --git a/src/core/src/main/java/org/apache/jmeter/timers/TimerService.java b/src/core/src/main/java/org/apache/jmeter/timers/TimerService.java
index 2fec09e..1b54571 100644
--- a/src/core/src/main/java/org/apache/jmeter/timers/TimerService.java
+++ b/src/core/src/main/java/org/apache/jmeter/timers/TimerService.java
@@ -47,28 +47,64 @@ public class TimerService {
 
     /**
      * Adjust delay so that initialDelay does not exceed end of test
-     * @param initialDelay initial delay in millis
+     * @param initialDelay initial delay in milliseconds
      * @return initialDelay or adjusted delay
      */
     public long adjustDelay(final long initialDelay) {
+        return adjustDelay(initialDelay, true);
+    }
+
+    /**
+     * Adjust delay so that initialDelay does not exceed end of test<br>
+     * If {@code runTillEnd} is {@code false} the delay will be shortened
+     * to {@code -1} if the delay would be longer than the remaining run time.
+     *
+     * @param initialDelay initial delay in milliseconds
+     * @param runTillEnd adjust delay to match the scheduled end
+     * @return initialDelay or adjusted delay
+     */
+    public long adjustDelay(final long initialDelay, boolean runTillEnd) {
         JMeterThread thread = JMeterContextService.getContext().getThread();
         long endTime = thread != null ? thread.getEndTime() : 0;
-        return adjustDelay(initialDelay, endTime);
+        return adjustDelay(initialDelay, endTime, runTillEnd);
     }
 
+
     /**
-     * Adjust delay so that initialDelay does not exceed end of test
-     * @param initialDelay initial delay in millis
+     * Adjust delay so that initialDelay does not exceed end of test<
+     *
+     * @param initialDelay initial delay in milliseconds
      * @param endTime End time of JMeterThread
-     * @return initialDelay or {@code -1} if delay is too long
+     * @return initialDelay or a shortened delay if delay is longer than the test is
+     *         scheduled
      */
     public long adjustDelay(final long initialDelay, long endTime) {
+        return adjustDelay(initialDelay, endTime, true);
+    }
+
+    /**
+     * Adjust delay so that initialDelay does not exceed end of test<br>
+     * If {@code runTillEnd} is {@code false} the delay will be shortened
+     * to {@code -1} if the delay would be longer than the remaining run time.
+     *
+     * @param initialDelay initial delay in milliseconds
+     * @param endTime End time of JMeterThread
+     * @param runTillEnd adjust delay to match the scheduled end
+     * @return initialDelay or a shortened delay if delay is longer than the test is
+     *         scheduled
+     */
+    public long adjustDelay(final long initialDelay, long endTime, boolean runTillEnd) {
         if (endTime > 0) {
             long now = System.currentTimeMillis();
             if (initialDelay > endTime - now) {
+                if (runTillEnd) {
+                    // shorten the delay to match endTime
+                    return endTime - now;
+                }
                 return -1;
             }
         }
         return initialDelay;
     }
+
 }