You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by pm...@apache.org on 2017/03/01 22:22:42 UTC

svn commit: r1785057 - in /jmeter/trunk: src/components/org/apache/jmeter/sampler/TestAction.java src/components/org/apache/jmeter/timers/TimerService.java src/core/org/apache/jmeter/threads/JMeterThread.java xdocs/changes.xml

Author: pmouawad
Date: Wed Mar  1 22:22:42 2017
New Revision: 1785057

URL: http://svn.apache.org/viewvc?rev=1785057&view=rev
Log:
Bug 60797 - TestAction in pause mode can last beyond configured duration of test
Bugzilla Id: 60797

Added:
    jmeter/trunk/src/components/org/apache/jmeter/timers/TimerService.java   (with props)
Modified:
    jmeter/trunk/src/components/org/apache/jmeter/sampler/TestAction.java
    jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java
    jmeter/trunk/xdocs/changes.xml

Modified: jmeter/trunk/src/components/org/apache/jmeter/sampler/TestAction.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/sampler/TestAction.java?rev=1785057&r1=1785056&r2=1785057&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/sampler/TestAction.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/sampler/TestAction.java Wed Mar  1 22:22:42 2017
@@ -33,6 +33,7 @@ import org.apache.jmeter.testelement.pro
 import org.apache.jmeter.testelement.property.StringProperty;
 import org.apache.jmeter.threads.JMeterContext;
 import org.apache.jmeter.threads.JMeterContextService;
+import org.apache.jmeter.timers.TimerService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -45,6 +46,8 @@ public class TestAction extends Abstract
 
     private static final Logger log = LoggerFactory.getLogger(TestAction.class);
 
+    private static final TimerService TIMER_SERVICE = TimerService.getInstance(); 
+
     private static final long serialVersionUID = 241L;
 
     private static final Set<String> APPLIABLE_CONFIG_CLASSES = new HashSet<>(
@@ -121,7 +124,7 @@ public class TestAction extends Abstract
         try {
             pauseThread = Thread.currentThread();
             if(millis>0) {
-                TimeUnit.MILLISECONDS.sleep(millis);
+                TimeUnit.MILLISECONDS.sleep(TIMER_SERVICE.adjustDelay(millis));
             } else if(millis<0) {
                 throw new IllegalArgumentException("Configured sleep is negative:"+millis);
             } // else == 0 we do nothing

Added: jmeter/trunk/src/components/org/apache/jmeter/timers/TimerService.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/timers/TimerService.java?rev=1785057&view=auto
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/timers/TimerService.java (added)
+++ jmeter/trunk/src/components/org/apache/jmeter/timers/TimerService.java Wed Mar  1 22:22:42 2017
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.jmeter.timers;
+
+import org.apache.jmeter.threads.JMeterContextService;
+import org.apache.jmeter.threads.JMeterThread;
+
+/**
+ * Manages logic related to timers and pauses
+ * @since 3.2
+ */
+public class TimerService {
+    
+    private TimerService() {
+        super();
+    }
+    
+    /**
+     * Initialization On Demand Holder pattern
+     */
+    private static class TimerServiceHolder {
+        public static final TimerService INSTANCE = new TimerService();
+    }
+ 
+    /**
+     * @return ScriptEngineManager singleton
+     */
+    public static TimerService getInstance() {
+        return TimerServiceHolder.INSTANCE;
+    }
+    
+    /**
+     * Adjust delay so that initialDelay does not exceed end of test
+     * @param delay initial delay in millis
+     * @return initialDelay or adjusted delay
+     */
+    public long adjustDelay(final long initialDelay) {
+        JMeterThread thread = JMeterContextService.getContext().getThread();
+        long endTime = thread != null ? thread.getEndTime() : 0;
+        return adjustDelay(initialDelay, endTime);
+    }
+
+    /**
+     * Adjust delay so that initialDelay does not exceed end of test
+     * @param initialDelay initial delay in millis
+     * @param endTime End time of JMeterThread
+     * @return initialDelay or adjusted delay
+     */
+    public long adjustDelay(final long initialDelay, long endTime) {
+        if (endTime > 0) {
+            long now = System.currentTimeMillis();
+            if(now + initialDelay > endTime) {
+                return endTime - now;
+            }
+        }
+        return initialDelay;
+    }
+}

Propchange: jmeter/trunk/src/components/org/apache/jmeter/timers/TimerService.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jmeter/trunk/src/components/org/apache/jmeter/timers/TimerService.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java?rev=1785057&r1=1785056&r2=1785057&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java Wed Mar  1 22:22:42 2017
@@ -47,6 +47,7 @@ import org.apache.jmeter.testelement.Tes
 import org.apache.jmeter.testelement.TestIterationListener;
 import org.apache.jmeter.testelement.ThreadListener;
 import org.apache.jmeter.timers.Timer;
+import org.apache.jmeter.timers.TimerService;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jorphan.collections.HashTree;
 import org.apache.jorphan.collections.HashTreeTraverser;
@@ -79,6 +80,7 @@ public class JMeterThread implements Run
 
     private static final float TIMER_FACTOR = JMeterUtils.getPropDefault("timer.factor", 1.0f);
 
+    private static final TimerService TIMER_SERVICE = TimerService.getInstance();
     /**
      * 1 as float
      */
@@ -842,10 +844,7 @@ public class JMeterThread implements Run
                 if(scheduler) {
                     // We reduce pause to ensure end of test is not delayed by a sleep ending after test scheduled end
                     // See Bug 60049
-                    long now = System.currentTimeMillis();
-                    if(now + totalDelay > endTime) {
-                        totalDelay = endTime - now;
-                    }
+                    totalDelay = TIMER_SERVICE.adjustDelay(totalDelay, endTime);
                 }
                 TimeUnit.MILLISECONDS.sleep(totalDelay);
             } catch (InterruptedException e) {

Modified: jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1785057&r1=1785056&r2=1785057&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml [utf-8] (original)
+++ jmeter/trunk/xdocs/changes.xml [utf-8] Wed Mar  1 22:22:42 2017
@@ -276,6 +276,7 @@ JMeter now requires Java 8. Ensure you u
     <li><bug>60730</bug>The JSON PostProcessor should set the <code>_ALL</code> variable even if the JSON path matches only once.</li>
     <li><bug>60747</bug>Response Assertion : Add Request Headers to <code>Field to Test</code></li>
     <li><bug>60763</bug>XMLAssertion should not leak errors to console</li>
+    <li><bug>60797</bug>TestAction in pause mode can last beyond configured duration of test</li>
 </ul>
 
 <h3>Functions</h3>



Re: svn commit: r1785057 - in /jmeter/trunk: src/components/org/apache/jmeter/sampler/TestAction.java src/components/org/apache/jmeter/timers/TimerService.java src/core/org/apache/jmeter/threads/JMeterThread.java xdocs/changes.xml

Posted by sebb <se...@gmail.com>.
On 2 March 2017 at 06:52, Philippe Mouawad <ph...@gmail.com> wrote:
> On Thursday, March 2, 2017, sebb <se...@gmail.com> wrote:
>
>> On 1 March 2017 at 22:22,  <pmouawad@apache.org <javascript:;>> wrote:
>> > Author: pmouawad
>> > Date: Wed Mar  1 22:22:42 2017
>> > New Revision: 1785057
>> >
>> > URL: http://svn.apache.org/viewvc?rev=1785057&view=rev
>> > Log:
>> > Bug 60797 - TestAction in pause mode can last beyond configured duration
>> of test
>> > Bugzilla Id: 60797
>> >
>> > Added:
>> >     jmeter/trunk/src/components/org/apache/jmeter/timers/TimerService.java
>>  (with props)
>> > Modified:
>> >     jmeter/trunk/src/components/org/apache/jmeter/sampler/
>> TestAction.java
>> >     jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java
>> >     jmeter/trunk/xdocs/changes.xml
>> >
>> > Modified: jmeter/trunk/src/components/org/apache/jmeter/sampler/
>> TestAction.java
>> > URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/
>> org/apache/jmeter/sampler/TestAction.java?rev=1785057&
>> r1=1785056&r2=1785057&view=diff
>> > ============================================================
>> ==================
>> > --- jmeter/trunk/src/components/org/apache/jmeter/sampler/TestAction.java
>> (original)
>> > +++ jmeter/trunk/src/components/org/apache/jmeter/sampler/TestAction.java
>> Wed Mar  1 22:22:42 2017
>> > @@ -33,6 +33,7 @@ import org.apache.jmeter.testelement.pro
>> >  import org.apache.jmeter.testelement.property.StringProperty;
>> >  import org.apache.jmeter.threads.JMeterContext;
>> >  import org.apache.jmeter.threads.JMeterContextService;
>> > +import org.apache.jmeter.timers.TimerService;
>> >  import org.slf4j.Logger;
>> >  import org.slf4j.LoggerFactory;
>> >
>> > @@ -45,6 +46,8 @@ public class TestAction extends Abstract
>> >
>> >      private static final Logger log = LoggerFactory.getLogger(
>> TestAction.class);
>> >
>> > +    private static final TimerService TIMER_SERVICE =
>> TimerService.getInstance();
>> > +
>> >      private static final long serialVersionUID = 241L;
>> >
>> >      private static final Set<String> APPLIABLE_CONFIG_CLASSES = new
>> HashSet<>(
>> > @@ -121,7 +124,7 @@ public class TestAction extends Abstract
>> >          try {
>> >              pauseThread = Thread.currentThread();
>> >              if(millis>0) {
>> > -                TimeUnit.MILLISECONDS.sleep(millis);
>> > +                TimeUnit.MILLISECONDS.sleep(TIMER_SERVICE.adjustDelay(
>> millis));
>> >              } else if(millis<0) {
>> >                  throw new IllegalArgumentException("Configured sleep
>> is negative:"+millis);
>> >              } // else == 0 we do nothing
>> >
>> > Added: jmeter/trunk/src/components/org/apache/jmeter/timers/
>> TimerService.java
>> > URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/
>> org/apache/jmeter/timers/TimerService.java?rev=1785057&view=auto
>> > ============================================================
>> ==================
>> > --- jmeter/trunk/src/components/org/apache/jmeter/timers/TimerService.java
>> (added)
>> > +++ jmeter/trunk/src/components/org/apache/jmeter/timers/TimerService.java
>> Wed Mar  1 22:22:42 2017
>> > @@ -0,0 +1,74 @@
>> > +/*
>> > + * Licensed to the Apache Software Foundation (ASF) under one or more
>> > + * contributor license agreements.  See the NOTICE file distributed with
>> > + * this work for additional information regarding copyright ownership.
>> > + * The ASF licenses this file to You under the Apache License, Version
>> 2.0
>> > + * (the "License"); you may not use this file except in compliance with
>> > + * the License.  You may obtain a copy of the License at
>> > + *
>> > + *   http://www.apache.org/licenses/LICENSE-2.0
>> > + *
>> > + * Unless required by applicable law or agreed to in writing, software
>> > + * distributed under the License is distributed on an "AS IS" BASIS,
>> > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> implied.
>> > + * See the License for the specific language governing permissions and
>> > + * limitations under the License.
>> > + *
>> > + */
>> > +
>> > +package org.apache.jmeter.timers;
>> > +
>> > +import org.apache.jmeter.threads.JMeterContextService;
>> > +import org.apache.jmeter.threads.JMeterThread;
>> > +
>> > +/**
>> > + * Manages logic related to timers and pauses
>> > + * @since 3.2
>> > + */
>> > +public class TimerService {
>> > +
>> > +    private TimerService() {
>> > +        super();
>> > +    }
>> > +
>> > +    /**
>> > +     * Initialization On Demand Holder pattern
>> > +     */
>> > +    private static class TimerServiceHolder {
>> > +        public static final TimerService INSTANCE = new TimerService();
>>
>> This should be package protected; no point in being public.
>
> Yes, I'll fix it
>
>>
>> > +    }
>> > +
>> > +    /**
>> > +     * @return ScriptEngineManager singleton
>> > +     */
>> > +    public static TimerService getInstance() {
>> > +        return TimerServiceHolder.INSTANCE;
>> > +    }
>>
>> But why is the IODH idiom used here?
>>
>> It looks just like a utility class.
>>
>> The methods could just be static.
>
> Inthe future the service might have state.

Or it might not.

But if it does acquire state, then it's likely that it cannot be a singleton.

In the meantime, it's harder to use.

Besides, the IODH idiom is intended for classes that include expensive
initialisation.

> Also

??

>
>>
>> > +
>> > +    /**
>> > +     * Adjust delay so that initialDelay does not exceed end of test
>> > +     * @param delay initial delay in millis
>> > +     * @return initialDelay or adjusted delay
>> > +     */
>> > +    public long adjustDelay(final long initialDelay) {
>> > +        JMeterThread thread = JMeterContextService.
>> getContext().getThread();
>> > +        long endTime = thread != null ? thread.getEndTime() : 0;
>> > +        return adjustDelay(initialDelay, endTime);
>> > +    }
>> > +
>> > +    /**
>> > +     * Adjust delay so that initialDelay does not exceed end of test
>> > +     * @param initialDelay initial delay in millis
>> > +     * @param endTime End time of JMeterThread
>> > +     * @return initialDelay or adjusted delay
>> > +     */
>> > +    public long adjustDelay(final long initialDelay, long endTime) {
>> > +        if (endTime > 0) {
>> > +            long now = System.currentTimeMillis();
>> > +            if(now + initialDelay > endTime) {
>> > +                return endTime - now;
>> > +            }
>> > +        }
>> > +        return initialDelay;
>> > +    }
>> > +}
>> >
>> > Propchange: jmeter/trunk/src/components/org/apache/jmeter/timers/
>> TimerService.java
>> > ------------------------------------------------------------
>> ------------------
>> >     svn:eol-style = native
>> >
>> > Propchange: jmeter/trunk/src/components/org/apache/jmeter/timers/
>> TimerService.java
>> > ------------------------------------------------------------
>> ------------------
>> >     svn:mime-type = text/plain
>> >
>> > Modified: jmeter/trunk/src/core/org/apache/jmeter/threads/
>> JMeterThread.java
>> > URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/
>> apache/jmeter/threads/JMeterThread.java?rev=1785057&
>> r1=1785056&r2=1785057&view=diff
>> > ============================================================
>> ==================
>> > --- jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java
>> (original)
>> > +++ jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java
>> Wed Mar  1 22:22:42 2017
>> > @@ -47,6 +47,7 @@ import org.apache.jmeter.testelement.Tes
>> >  import org.apache.jmeter.testelement.TestIterationListener;
>> >  import org.apache.jmeter.testelement.ThreadListener;
>> >  import org.apache.jmeter.timers.Timer;
>> > +import org.apache.jmeter.timers.TimerService;
>> >  import org.apache.jmeter.util.JMeterUtils;
>> >  import org.apache.jorphan.collections.HashTree;
>> >  import org.apache.jorphan.collections.HashTreeTraverser;
>> > @@ -79,6 +80,7 @@ public class JMeterThread implements Run
>> >
>> >      private static final float TIMER_FACTOR =
>> JMeterUtils.getPropDefault("timer.factor", 1.0f);
>> >
>> > +    private static final TimerService TIMER_SERVICE =
>> TimerService.getInstance();
>> >      /**
>> >       * 1 as float
>> >       */
>> > @@ -842,10 +844,7 @@ public class JMeterThread implements Run
>> >                  if(scheduler) {
>> >                      // We reduce pause to ensure end of test is not
>> delayed by a sleep ending after test scheduled end
>> >                      // See Bug 60049
>> > -                    long now = System.currentTimeMillis();
>> > -                    if(now + totalDelay > endTime) {
>> > -                        totalDelay = endTime - now;
>> > -                    }
>> > +                    totalDelay = TIMER_SERVICE.adjustDelay(totalDelay,
>> endTime);
>> >                  }
>> >                  TimeUnit.MILLISECONDS.sleep(totalDelay);
>> >              } catch (InterruptedException e) {
>> >
>> > Modified: jmeter/trunk/xdocs/changes.xml
>> > URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.
>> xml?rev=1785057&r1=1785056&r2=1785057&view=diff
>> > ============================================================
>> ==================
>> > --- jmeter/trunk/xdocs/changes.xml [utf-8] (original)
>> > +++ jmeter/trunk/xdocs/changes.xml [utf-8] Wed Mar  1 22:22:42 2017
>> > @@ -276,6 +276,7 @@ JMeter now requires Java 8. Ensure you u
>> >      <li><bug>60730</bug>The JSON PostProcessor should set the
>> <code>_ALL</code> variable even if the JSON path matches only once.</li>
>> >      <li><bug>60747</bug>Response Assertion : Add Request Headers to
>> <code>Field to Test</code></li>
>> >      <li><bug>60763</bug>XMLAssertion should not leak errors to
>> console</li>
>> > +    <li><bug>60797</bug>TestAction in pause mode can last beyond
>> configured duration of test</li>
>> >  </ul>
>> >
>> >  <h3>Functions</h3>
>> >
>> >
>>
>
>
> --
> Cordialement.
> Philippe Mouawad.

Re: svn commit: r1785057 - in /jmeter/trunk: src/components/org/apache/jmeter/sampler/TestAction.java src/components/org/apache/jmeter/timers/TimerService.java src/core/org/apache/jmeter/threads/JMeterThread.java xdocs/changes.xml

Posted by Philippe Mouawad <ph...@gmail.com>.
On Thursday, March 2, 2017, sebb <se...@gmail.com> wrote:

> On 1 March 2017 at 22:22,  <pmouawad@apache.org <javascript:;>> wrote:
> > Author: pmouawad
> > Date: Wed Mar  1 22:22:42 2017
> > New Revision: 1785057
> >
> > URL: http://svn.apache.org/viewvc?rev=1785057&view=rev
> > Log:
> > Bug 60797 - TestAction in pause mode can last beyond configured duration
> of test
> > Bugzilla Id: 60797
> >
> > Added:
> >     jmeter/trunk/src/components/org/apache/jmeter/timers/TimerService.java
>  (with props)
> > Modified:
> >     jmeter/trunk/src/components/org/apache/jmeter/sampler/
> TestAction.java
> >     jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java
> >     jmeter/trunk/xdocs/changes.xml
> >
> > Modified: jmeter/trunk/src/components/org/apache/jmeter/sampler/
> TestAction.java
> > URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/
> org/apache/jmeter/sampler/TestAction.java?rev=1785057&
> r1=1785056&r2=1785057&view=diff
> > ============================================================
> ==================
> > --- jmeter/trunk/src/components/org/apache/jmeter/sampler/TestAction.java
> (original)
> > +++ jmeter/trunk/src/components/org/apache/jmeter/sampler/TestAction.java
> Wed Mar  1 22:22:42 2017
> > @@ -33,6 +33,7 @@ import org.apache.jmeter.testelement.pro
> >  import org.apache.jmeter.testelement.property.StringProperty;
> >  import org.apache.jmeter.threads.JMeterContext;
> >  import org.apache.jmeter.threads.JMeterContextService;
> > +import org.apache.jmeter.timers.TimerService;
> >  import org.slf4j.Logger;
> >  import org.slf4j.LoggerFactory;
> >
> > @@ -45,6 +46,8 @@ public class TestAction extends Abstract
> >
> >      private static final Logger log = LoggerFactory.getLogger(
> TestAction.class);
> >
> > +    private static final TimerService TIMER_SERVICE =
> TimerService.getInstance();
> > +
> >      private static final long serialVersionUID = 241L;
> >
> >      private static final Set<String> APPLIABLE_CONFIG_CLASSES = new
> HashSet<>(
> > @@ -121,7 +124,7 @@ public class TestAction extends Abstract
> >          try {
> >              pauseThread = Thread.currentThread();
> >              if(millis>0) {
> > -                TimeUnit.MILLISECONDS.sleep(millis);
> > +                TimeUnit.MILLISECONDS.sleep(TIMER_SERVICE.adjustDelay(
> millis));
> >              } else if(millis<0) {
> >                  throw new IllegalArgumentException("Configured sleep
> is negative:"+millis);
> >              } // else == 0 we do nothing
> >
> > Added: jmeter/trunk/src/components/org/apache/jmeter/timers/
> TimerService.java
> > URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/
> org/apache/jmeter/timers/TimerService.java?rev=1785057&view=auto
> > ============================================================
> ==================
> > --- jmeter/trunk/src/components/org/apache/jmeter/timers/TimerService.java
> (added)
> > +++ jmeter/trunk/src/components/org/apache/jmeter/timers/TimerService.java
> Wed Mar  1 22:22:42 2017
> > @@ -0,0 +1,74 @@
> > +/*
> > + * Licensed to the Apache Software Foundation (ASF) under one or more
> > + * contributor license agreements.  See the NOTICE file distributed with
> > + * this work for additional information regarding copyright ownership.
> > + * The ASF licenses this file to You under the Apache License, Version
> 2.0
> > + * (the "License"); you may not use this file except in compliance with
> > + * the License.  You may obtain a copy of the License at
> > + *
> > + *   http://www.apache.org/licenses/LICENSE-2.0
> > + *
> > + * Unless required by applicable law or agreed to in writing, software
> > + * distributed under the License is distributed on an "AS IS" BASIS,
> > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> > + * See the License for the specific language governing permissions and
> > + * limitations under the License.
> > + *
> > + */
> > +
> > +package org.apache.jmeter.timers;
> > +
> > +import org.apache.jmeter.threads.JMeterContextService;
> > +import org.apache.jmeter.threads.JMeterThread;
> > +
> > +/**
> > + * Manages logic related to timers and pauses
> > + * @since 3.2
> > + */
> > +public class TimerService {
> > +
> > +    private TimerService() {
> > +        super();
> > +    }
> > +
> > +    /**
> > +     * Initialization On Demand Holder pattern
> > +     */
> > +    private static class TimerServiceHolder {
> > +        public static final TimerService INSTANCE = new TimerService();
>
> This should be package protected; no point in being public.

Yes, I'll fix it

>
> > +    }
> > +
> > +    /**
> > +     * @return ScriptEngineManager singleton
> > +     */
> > +    public static TimerService getInstance() {
> > +        return TimerServiceHolder.INSTANCE;
> > +    }
>
> But why is the IODH idiom used here?
>
> It looks just like a utility class.
>
> The methods could just be static.

Inthe future the service might have state.
Also

>
> > +
> > +    /**
> > +     * Adjust delay so that initialDelay does not exceed end of test
> > +     * @param delay initial delay in millis
> > +     * @return initialDelay or adjusted delay
> > +     */
> > +    public long adjustDelay(final long initialDelay) {
> > +        JMeterThread thread = JMeterContextService.
> getContext().getThread();
> > +        long endTime = thread != null ? thread.getEndTime() : 0;
> > +        return adjustDelay(initialDelay, endTime);
> > +    }
> > +
> > +    /**
> > +     * Adjust delay so that initialDelay does not exceed end of test
> > +     * @param initialDelay initial delay in millis
> > +     * @param endTime End time of JMeterThread
> > +     * @return initialDelay or adjusted delay
> > +     */
> > +    public long adjustDelay(final long initialDelay, long endTime) {
> > +        if (endTime > 0) {
> > +            long now = System.currentTimeMillis();
> > +            if(now + initialDelay > endTime) {
> > +                return endTime - now;
> > +            }
> > +        }
> > +        return initialDelay;
> > +    }
> > +}
> >
> > Propchange: jmeter/trunk/src/components/org/apache/jmeter/timers/
> TimerService.java
> > ------------------------------------------------------------
> ------------------
> >     svn:eol-style = native
> >
> > Propchange: jmeter/trunk/src/components/org/apache/jmeter/timers/
> TimerService.java
> > ------------------------------------------------------------
> ------------------
> >     svn:mime-type = text/plain
> >
> > Modified: jmeter/trunk/src/core/org/apache/jmeter/threads/
> JMeterThread.java
> > URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/
> apache/jmeter/threads/JMeterThread.java?rev=1785057&
> r1=1785056&r2=1785057&view=diff
> > ============================================================
> ==================
> > --- jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java
> (original)
> > +++ jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java
> Wed Mar  1 22:22:42 2017
> > @@ -47,6 +47,7 @@ import org.apache.jmeter.testelement.Tes
> >  import org.apache.jmeter.testelement.TestIterationListener;
> >  import org.apache.jmeter.testelement.ThreadListener;
> >  import org.apache.jmeter.timers.Timer;
> > +import org.apache.jmeter.timers.TimerService;
> >  import org.apache.jmeter.util.JMeterUtils;
> >  import org.apache.jorphan.collections.HashTree;
> >  import org.apache.jorphan.collections.HashTreeTraverser;
> > @@ -79,6 +80,7 @@ public class JMeterThread implements Run
> >
> >      private static final float TIMER_FACTOR =
> JMeterUtils.getPropDefault("timer.factor", 1.0f);
> >
> > +    private static final TimerService TIMER_SERVICE =
> TimerService.getInstance();
> >      /**
> >       * 1 as float
> >       */
> > @@ -842,10 +844,7 @@ public class JMeterThread implements Run
> >                  if(scheduler) {
> >                      // We reduce pause to ensure end of test is not
> delayed by a sleep ending after test scheduled end
> >                      // See Bug 60049
> > -                    long now = System.currentTimeMillis();
> > -                    if(now + totalDelay > endTime) {
> > -                        totalDelay = endTime - now;
> > -                    }
> > +                    totalDelay = TIMER_SERVICE.adjustDelay(totalDelay,
> endTime);
> >                  }
> >                  TimeUnit.MILLISECONDS.sleep(totalDelay);
> >              } catch (InterruptedException e) {
> >
> > Modified: jmeter/trunk/xdocs/changes.xml
> > URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.
> xml?rev=1785057&r1=1785056&r2=1785057&view=diff
> > ============================================================
> ==================
> > --- jmeter/trunk/xdocs/changes.xml [utf-8] (original)
> > +++ jmeter/trunk/xdocs/changes.xml [utf-8] Wed Mar  1 22:22:42 2017
> > @@ -276,6 +276,7 @@ JMeter now requires Java 8. Ensure you u
> >      <li><bug>60730</bug>The JSON PostProcessor should set the
> <code>_ALL</code> variable even if the JSON path matches only once.</li>
> >      <li><bug>60747</bug>Response Assertion : Add Request Headers to
> <code>Field to Test</code></li>
> >      <li><bug>60763</bug>XMLAssertion should not leak errors to
> console</li>
> > +    <li><bug>60797</bug>TestAction in pause mode can last beyond
> configured duration of test</li>
> >  </ul>
> >
> >  <h3>Functions</h3>
> >
> >
>


-- 
Cordialement.
Philippe Mouawad.

Re: svn commit: r1785057 - in /jmeter/trunk: src/components/org/apache/jmeter/sampler/TestAction.java src/components/org/apache/jmeter/timers/TimerService.java src/core/org/apache/jmeter/threads/JMeterThread.java xdocs/changes.xml

Posted by sebb <se...@gmail.com>.
On 1 March 2017 at 22:22,  <pm...@apache.org> wrote:
> Author: pmouawad
> Date: Wed Mar  1 22:22:42 2017
> New Revision: 1785057
>
> URL: http://svn.apache.org/viewvc?rev=1785057&view=rev
> Log:
> Bug 60797 - TestAction in pause mode can last beyond configured duration of test
> Bugzilla Id: 60797
>
> Added:
>     jmeter/trunk/src/components/org/apache/jmeter/timers/TimerService.java   (with props)
> Modified:
>     jmeter/trunk/src/components/org/apache/jmeter/sampler/TestAction.java
>     jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java
>     jmeter/trunk/xdocs/changes.xml
>
> Modified: jmeter/trunk/src/components/org/apache/jmeter/sampler/TestAction.java
> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/sampler/TestAction.java?rev=1785057&r1=1785056&r2=1785057&view=diff
> ==============================================================================
> --- jmeter/trunk/src/components/org/apache/jmeter/sampler/TestAction.java (original)
> +++ jmeter/trunk/src/components/org/apache/jmeter/sampler/TestAction.java Wed Mar  1 22:22:42 2017
> @@ -33,6 +33,7 @@ import org.apache.jmeter.testelement.pro
>  import org.apache.jmeter.testelement.property.StringProperty;
>  import org.apache.jmeter.threads.JMeterContext;
>  import org.apache.jmeter.threads.JMeterContextService;
> +import org.apache.jmeter.timers.TimerService;
>  import org.slf4j.Logger;
>  import org.slf4j.LoggerFactory;
>
> @@ -45,6 +46,8 @@ public class TestAction extends Abstract
>
>      private static final Logger log = LoggerFactory.getLogger(TestAction.class);
>
> +    private static final TimerService TIMER_SERVICE = TimerService.getInstance();
> +
>      private static final long serialVersionUID = 241L;
>
>      private static final Set<String> APPLIABLE_CONFIG_CLASSES = new HashSet<>(
> @@ -121,7 +124,7 @@ public class TestAction extends Abstract
>          try {
>              pauseThread = Thread.currentThread();
>              if(millis>0) {
> -                TimeUnit.MILLISECONDS.sleep(millis);
> +                TimeUnit.MILLISECONDS.sleep(TIMER_SERVICE.adjustDelay(millis));
>              } else if(millis<0) {
>                  throw new IllegalArgumentException("Configured sleep is negative:"+millis);
>              } // else == 0 we do nothing
>
> Added: jmeter/trunk/src/components/org/apache/jmeter/timers/TimerService.java
> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/timers/TimerService.java?rev=1785057&view=auto
> ==============================================================================
> --- jmeter/trunk/src/components/org/apache/jmeter/timers/TimerService.java (added)
> +++ jmeter/trunk/src/components/org/apache/jmeter/timers/TimerService.java Wed Mar  1 22:22:42 2017
> @@ -0,0 +1,74 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *   http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + *
> + */
> +
> +package org.apache.jmeter.timers;
> +
> +import org.apache.jmeter.threads.JMeterContextService;
> +import org.apache.jmeter.threads.JMeterThread;
> +
> +/**
> + * Manages logic related to timers and pauses
> + * @since 3.2
> + */
> +public class TimerService {
> +
> +    private TimerService() {
> +        super();
> +    }
> +
> +    /**
> +     * Initialization On Demand Holder pattern
> +     */
> +    private static class TimerServiceHolder {
> +        public static final TimerService INSTANCE = new TimerService();

This should be package protected; no point in being public.

> +    }
> +
> +    /**
> +     * @return ScriptEngineManager singleton
> +     */
> +    public static TimerService getInstance() {
> +        return TimerServiceHolder.INSTANCE;
> +    }

But why is the IODH idiom used here?

It looks just like a utility class.

The methods could just be static.

> +
> +    /**
> +     * Adjust delay so that initialDelay does not exceed end of test
> +     * @param delay initial delay in millis
> +     * @return initialDelay or adjusted delay
> +     */
> +    public long adjustDelay(final long initialDelay) {
> +        JMeterThread thread = JMeterContextService.getContext().getThread();
> +        long endTime = thread != null ? thread.getEndTime() : 0;
> +        return adjustDelay(initialDelay, endTime);
> +    }
> +
> +    /**
> +     * Adjust delay so that initialDelay does not exceed end of test
> +     * @param initialDelay initial delay in millis
> +     * @param endTime End time of JMeterThread
> +     * @return initialDelay or adjusted delay
> +     */
> +    public long adjustDelay(final long initialDelay, long endTime) {
> +        if (endTime > 0) {
> +            long now = System.currentTimeMillis();
> +            if(now + initialDelay > endTime) {
> +                return endTime - now;
> +            }
> +        }
> +        return initialDelay;
> +    }
> +}
>
> Propchange: jmeter/trunk/src/components/org/apache/jmeter/timers/TimerService.java
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Propchange: jmeter/trunk/src/components/org/apache/jmeter/timers/TimerService.java
> ------------------------------------------------------------------------------
>     svn:mime-type = text/plain
>
> Modified: jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java
> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java?rev=1785057&r1=1785056&r2=1785057&view=diff
> ==============================================================================
> --- jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java (original)
> +++ jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java Wed Mar  1 22:22:42 2017
> @@ -47,6 +47,7 @@ import org.apache.jmeter.testelement.Tes
>  import org.apache.jmeter.testelement.TestIterationListener;
>  import org.apache.jmeter.testelement.ThreadListener;
>  import org.apache.jmeter.timers.Timer;
> +import org.apache.jmeter.timers.TimerService;
>  import org.apache.jmeter.util.JMeterUtils;
>  import org.apache.jorphan.collections.HashTree;
>  import org.apache.jorphan.collections.HashTreeTraverser;
> @@ -79,6 +80,7 @@ public class JMeterThread implements Run
>
>      private static final float TIMER_FACTOR = JMeterUtils.getPropDefault("timer.factor", 1.0f);
>
> +    private static final TimerService TIMER_SERVICE = TimerService.getInstance();
>      /**
>       * 1 as float
>       */
> @@ -842,10 +844,7 @@ public class JMeterThread implements Run
>                  if(scheduler) {
>                      // We reduce pause to ensure end of test is not delayed by a sleep ending after test scheduled end
>                      // See Bug 60049
> -                    long now = System.currentTimeMillis();
> -                    if(now + totalDelay > endTime) {
> -                        totalDelay = endTime - now;
> -                    }
> +                    totalDelay = TIMER_SERVICE.adjustDelay(totalDelay, endTime);
>                  }
>                  TimeUnit.MILLISECONDS.sleep(totalDelay);
>              } catch (InterruptedException e) {
>
> Modified: jmeter/trunk/xdocs/changes.xml
> URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1785057&r1=1785056&r2=1785057&view=diff
> ==============================================================================
> --- jmeter/trunk/xdocs/changes.xml [utf-8] (original)
> +++ jmeter/trunk/xdocs/changes.xml [utf-8] Wed Mar  1 22:22:42 2017
> @@ -276,6 +276,7 @@ JMeter now requires Java 8. Ensure you u
>      <li><bug>60730</bug>The JSON PostProcessor should set the <code>_ALL</code> variable even if the JSON path matches only once.</li>
>      <li><bug>60747</bug>Response Assertion : Add Request Headers to <code>Field to Test</code></li>
>      <li><bug>60763</bug>XMLAssertion should not leak errors to console</li>
> +    <li><bug>60797</bug>TestAction in pause mode can last beyond configured duration of test</li>
>  </ul>
>
>  <h3>Functions</h3>
>
>