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 2016/11/12 21:26:36 UTC

svn commit: r1769429 - in /jmeter/trunk: src/core/org/apache/jmeter/threads/ThreadGroup.java xdocs/changes.xml

Author: pmouawad
Date: Sat Nov 12 21:26:36 2016
New Revision: 1769429

URL: http://svn.apache.org/viewvc?rev=1769429&view=rev
Log:
Bug 60299 - Thread Group with Scheduler : Weird behaviour when End-Time is in the past 
Bugzilla Id: 60299

Modified:
    jmeter/trunk/src/core/org/apache/jmeter/threads/ThreadGroup.java
    jmeter/trunk/xdocs/changes.xml

Modified: jmeter/trunk/src/core/org/apache/jmeter/threads/ThreadGroup.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/threads/ThreadGroup.java?rev=1769429&r1=1769428&r2=1769429&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/threads/ThreadGroup.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/threads/ThreadGroup.java Sat Nov 12 21:26:36 2016
@@ -18,6 +18,8 @@
 
 package org.apache.jmeter.threads;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
@@ -31,6 +33,7 @@ import org.apache.jmeter.testelement.pro
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jorphan.collections.ListedHashTree;
 import org.apache.jorphan.logging.LoggingManager;
+import org.apache.jorphan.util.JMeterStopTestException;
 import org.apache.log.Logger;
 
 /**
@@ -42,6 +45,8 @@ public class ThreadGroup extends Abstrac
     private static final long serialVersionUID = 280L;
 
     private static final Logger log = LoggingManager.getLoggerForClass();
+    
+    private static final String DATE_FIELD_FORMAT = "yyyy/MM/dd HH:mm:ss"; //$NON-NLS-1$
 
     private static final long WAIT_TO_DIE = JMeterUtils.getPropDefault("jmeterengine.threadstop.wait", 5 * 1000); // 5 seconds
 
@@ -218,6 +223,7 @@ public class ThreadGroup extends Abstrac
      * @param thread JMeterThread
      */
     private void scheduleThread(JMeterThread thread, long now) {
+
         // if true the Scheduler is enabled
         if (getScheduler()) {
             // set the start time for the Thread
@@ -227,7 +233,7 @@ public class ThreadGroup extends Abstrac
                 long start = getStartTime();
                 if (start < now) {
                     start = now; // Force a sensible start time
-                }
+                }                
                 thread.setStartTime(start);
             }
 
@@ -235,6 +241,12 @@ public class ThreadGroup extends Abstrac
             if (getDuration() > 0) {// Duration is in seconds
                 thread.setEndTime(getDuration() * 1000 + (thread.getStartTime()));
             } else {
+                if( getEndTime() <= now ) {
+                    SimpleDateFormat sdf = new SimpleDateFormat(DATE_FIELD_FORMAT);
+                    throw new JMeterStopTestException("End Time ("
+                            + sdf.format(new Date(getEndTime()))+") of Scheduler for Thread Group "+getName() 
+                            + " is in the past, fix value of End Time field");
+                }
                 thread.setEndTime(getEndTime());
             }
 
@@ -533,49 +545,59 @@ public class ThreadGroup extends Abstrac
         
         @Override
         public void run() {
-            // Copy in ThreadStarter thread context from calling Thread
-            JMeterContextService.getContext().setVariables(this.context.getVariables());
-            long now = System.currentTimeMillis(); // needs to be constant for all threads
-            long endtime = 0;
-            final boolean usingScheduler = getScheduler();
-            if (usingScheduler) {
-                // set the start time for the Thread
-                if (getDelay() > 0) {// Duration is in seconds
-                    delayBy(getDelay() * 1000);
-                } else {
-                    long start = getStartTime();
-                    if (start >= now) {
-                        delayBy(start-now);
-                    } 
-                    // else start immediately
-                }
-                // set the endtime for the Thread
-                endtime = getDuration();
-                if (endtime > 0) {// Duration is in seconds, starting from when the threads start
-                    endtime = endtime *1000 + System.currentTimeMillis();
-                } else {
-                    endtime = getEndTime();
-                }
-            }
-            final int numThreads = getNumThreads();
-            final int perThreadDelayInMillis = Math.round(((float) (getRampUp() * 1000) / (float) numThreads));
-            for (int i = 0; running && i < numThreads; i++) {
-                if (i > 0) {
-                    pause(perThreadDelayInMillis); // ramp-up delay (except first)
-                }
-                if (usingScheduler && System.currentTimeMillis() > endtime) {
-                    break; // no point continuing beyond the end time
-                }
-                JMeterThread jmThread = makeThread(groupCount, notifier, threadGroupTree, engine, i, context);
-                jmThread.setInitialDelay(0);   // Already waited
+            try {
+                // Copy in ThreadStarter thread context from calling Thread
+                JMeterContextService.getContext().setVariables(this.context.getVariables());
+                long now = System.currentTimeMillis(); // needs to be constant for all threads
+                long endtime = 0;
+                final boolean usingScheduler = getScheduler();
                 if (usingScheduler) {
-                    jmThread.setScheduled(true);
-                    jmThread.setEndTime(endtime);
+                    // set the start time for the Thread
+                    if (getDelay() > 0) {// Duration is in seconds
+                        delayBy(getDelay() * 1000);
+                    } else {
+                        long start = getStartTime();
+                        if (start >= now) {
+                            delayBy(start-now);
+                        } 
+                        // else start immediately
+                    }
+                    // set the endtime for the Thread
+                    endtime = getDuration();
+                    if (endtime > 0) {// Duration is in seconds, starting from when the threads start
+                        endtime = endtime *1000 + System.currentTimeMillis();
+                    } else {
+                        if( getEndTime() <= now ) {
+                            SimpleDateFormat sdf = new SimpleDateFormat(DATE_FIELD_FORMAT);
+                            throw new JMeterStopTestException("End Time ("
+                                    + sdf.format(new Date(getEndTime()))+") of Scheduler for Thread Group "+getName() 
+                                    + " is in the past, fix value of End Time field");
+                        }
+                        endtime = getEndTime();
+                    }
                 }
-                Thread newThread = new Thread(jmThread, jmThread.getThreadName());
-                newThread.setDaemon(false); // ThreadStarter is daemon, but we don't want sampler threads to be so too
-                registerStartedThread(jmThread, newThread);
-                newThread.start();
+                final int numThreads = getNumThreads();
+                final int perThreadDelayInMillis = Math.round(((float) (getRampUp() * 1000) / (float) numThreads));
+                for (int i = 0; running && i < numThreads; i++) {
+                    if (i > 0) {
+                        pause(perThreadDelayInMillis); // ramp-up delay (except first)
+                    }
+                    if (usingScheduler && System.currentTimeMillis() > endtime) {
+                        break; // no point continuing beyond the end time
+                    }
+                    JMeterThread jmThread = makeThread(groupCount, notifier, threadGroupTree, engine, i, context);
+                    jmThread.setInitialDelay(0);   // Already waited
+                    if (usingScheduler) {
+                        jmThread.setScheduled(true);
+                        jmThread.setEndTime(endtime);
+                    }
+                    Thread newThread = new Thread(jmThread, jmThread.getThreadName());
+                    newThread.setDaemon(false); // ThreadStarter is daemon, but we don't want sampler threads to be so too
+                    registerStartedThread(jmThread, newThread);
+                    newThread.start();
+                }
+            } catch (Exception ex) {
+                log.error("An error occured scheduling delay start of threads for Thread Group:"+getName(), ex);
             }
         }
     }

Modified: jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1769429&r1=1769428&r2=1769429&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml [utf-8] (original)
+++ jmeter/trunk/xdocs/changes.xml [utf-8] Sat Nov 12 21:26:36 2016
@@ -362,6 +362,7 @@ This allows you to update Think Times fr
     <li><bug>59439</bug>Report / Dashboard : AbstractOverTimeGraphConsumer.createGroupInfos() should be abstract</li>
     <li><bug>59918</bug>Ant generated HTML report is broken (extras folder)</li>
     <li><bug>60295</bug>JSON Extractor doesn't index array elements when only one element is found. Based on a patch by Roberto Braga (roberto.braga at sociale.it)</li>
+    <li><bug>60299</bug>Thread Group with Scheduler : Weird behaviour when End-Time is in the past</li>
 </ul>
 
  <!--  =================== Thanks =================== -->