You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jmeter-dev@jakarta.apache.org by se...@apache.org on 2005/05/28 22:52:06 UTC
cvs commit: jakarta-jmeter/src/core/org/apache/jmeter/threads ThreadGroup.java JMeterThread.java
sebb 2005/05/28 13:52:06
Modified: xdocs changes.xml
src/core/org/apache/jmeter/engine StandardJMeterEngine.java
src/components/org/apache/jmeter/timers
ConstantThroughputTimer.java
ConstantThroughputTimerBeanInfo.java
src/core/org/apache/jmeter/threads ThreadGroup.java
JMeterThread.java
Log:
Bug 34739 - Enhance constant Throughput timer
Fix time calculation so per-thread works better
Revision Changes Path
1.27 +2 -1 jakarta-jmeter/xdocs/changes.xml
Index: changes.xml
===================================================================
RCS file: /home/cvs/jakarta-jmeter/xdocs/changes.xml,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- changes.xml 28 May 2005 10:33:54 -0000 1.26
+++ changes.xml 28 May 2005 20:52:06 -0000 1.27
@@ -42,6 +42,7 @@
<li>Changed following Samplers to set sample label from sampler name</li>
<li>All Test elements can be saved as a graphics image to a file</li>
<li>Bug 35026 - add RE pattern matching to Proxy</li>
+<li>Bug 34739 - Enhance constant Throughput timer</li>
</ul>
<h4>Bug fixes:</h4>
<ul>
1.59 +1 -0 jakarta-jmeter/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java
Index: StandardJMeterEngine.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -r1.58 -r1.59
--- StandardJMeterEngine.java 14 May 2005 22:30:15 -0000 1.58
+++ StandardJMeterEngine.java 28 May 2005 20:52:06 -0000 1.59
@@ -399,6 +399,7 @@
threads[i] = new JMeterThread(cloneTree(threadGroupTree), this,
notifier);
threads[i].setThreadNum(i);
+ threads[i].setThreadGroup(group);
threads[i].setInitialContext(JMeterContextService.getContext());
threads[i].setInitialDelay((int) (perThreadDelay * i));
threads[i].setThreadName(groupName + " " + (groupCount) + "-" + (i + 1));
1.21 +49 -36 jakarta-jmeter/src/components/org/apache/jmeter/timers/ConstantThroughputTimer.java
Index: ConstantThroughputTimer.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/components/org/apache/jmeter/timers/ConstantThroughputTimer.java,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- ConstantThroughputTimer.java 14 Dec 2004 00:37:13 -0000 1.20
+++ ConstantThroughputTimer.java 28 May 2005 20:52:06 -0000 1.21
@@ -35,8 +35,9 @@
public class ConstantThroughputTimer extends AbstractTestElement implements Timer, TestListener,
TestBean
{
- private static final long serialVersionUID = 1;
+ private static final long serialVersionUID = 2;
private static final Logger log = LoggingManager.getLoggerForClass();
+ private static final double MILLISEC_PER_MIN = 60000.0;
/**
* Target time for the start of the next request. The delay provided by the
@@ -44,22 +45,9 @@
*/
private long previousTime = 0;
- private boolean legacyMode = true;
+ private String calcMode; // String representing the mode (Locale-specific)
+ private int modeInt; // mode as an integer
-/**
- * @return Returns the legacyMode.
- */
-public boolean isLegacyMode()
-{
- return legacyMode;
-}
-/**
- * @param legacyMode The legacyMode to set.
- */
-public void setLegacyMode(boolean legacyMode)
-{
- this.legacyMode = legacyMode;
-}
/**
* Desired throughput, in samples per minute.
*/
@@ -93,6 +81,16 @@
return throughput;
}
+ public String getCalcMode() {
+ return calcMode;
+ }
+
+ public void setCalcMode(String mode) {
+ // TODO find better way to get modeInt
+ this.modeInt = ConstantThroughputTimerBeanInfo.getCalcModeAsInt(calcMode);
+ this.calcMode = mode;
+ }
+
/**
* Retrieve the delay to use during test execution.
*
@@ -101,8 +99,8 @@
public synchronized long delay()
{
long currentTime = System.currentTimeMillis();
- long currentTarget = calculateCurrentTarget(currentTime);
- previousTime = currentTarget;
+ long currentTarget = previousTime == 0 ? currentTime : previousTime;
+ previousTime = currentTarget + calculateDelay();
if (currentTime > currentTarget)
{
// We're behind schedule -- try to catch up:
@@ -112,28 +110,42 @@
}
/**
- * @param currentTime
- * @return
- */
-protected long calculateCurrentTarget(long currentTime)
-{
- long currentTarget = currentTime;
- if(previousTime == 0)
+ * @param currentTime
+ * @return new Target time
+ */
+ protected long calculateCurrentTarget(long currentTime)
{
- currentTarget = currentTime + (
- (legacyMode) ? (long) (60000.0 / getThroughput()) :
- (JMeterContextService.getContext().getThreadNum() + 1) * (long) (60000.0 / getThroughput())
- );
+ return currentTime + calculateDelay();
}
- else
+
+
+ // Calculate the delay based on the mode
+ private long calculateDelay()
{
- currentTarget = currentTime + (
- (legacyMode) ? (long) (60000.0 / getThroughput()) :
- (JMeterContextService.getNumberOfThreads()) * (long) (60000.0 / getThroughput())
- );
+ long offset=0;
+ long rate = (long) (MILLISEC_PER_MIN / getThroughput());
+ switch(modeInt)
+ {
+ case 1: // Total number of threads
+ offset = (
+// previousTime == 0 ? //TODO - why is this needed?
+// (JMeterContextService.getContext().getThreadNum() + 1)
+// :
+ JMeterContextService.getNumberOfThreads()
+ )
+ * rate;
+ break;
+ case 2: // Active threads in this group
+ offset = JMeterContextService.getContext().getThread()
+ .getThreadGroup().getNumberOfThreads() * rate;
+ break;
+ default:
+ offset = rate; // i.e. rate * 1
+ break;
+ }
+ return offset;
}
- return currentTarget;
-}
+
/**
* Provide a description of this timer class.
*
@@ -174,6 +186,7 @@
*/
public void testStarted(String host)
{
+ testStarted();
}
/*
1.7 +23 -6 jakarta-jmeter/src/components/org/apache/jmeter/timers/ConstantThroughputTimerBeanInfo.java
Index: ConstantThroughputTimerBeanInfo.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/components/org/apache/jmeter/timers/ConstantThroughputTimerBeanInfo.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- ConstantThroughputTimerBeanInfo.java 14 Dec 2004 00:37:13 -0000 1.6
+++ ConstantThroughputTimerBeanInfo.java 28 May 2005 20:52:06 -0000 1.7
@@ -19,6 +19,7 @@
package org.apache.jmeter.timers;
import java.beans.PropertyDescriptor;
+import java.util.ResourceBundle;
import org.apache.jmeter.testbeans.BeanInfoSupport;
@@ -29,20 +30,36 @@
*/
public class ConstantThroughputTimerBeanInfo extends BeanInfoSupport
{
+ private static final String[] tags = new String[3];
+
public ConstantThroughputTimerBeanInfo()
{
- super(ConstantThroughputTimer.class);
+ super(ConstantThroughputTimer.class);
- createPropertyGroup("delay", new String[] { "throughput", "legacyMode" });
+ ResourceBundle rb = (ResourceBundle) getBeanDescriptor().getValue(RESOURCE_BUNDLE);
+ tags[0]=rb.getString("calcMode.1");// These must agree with the Timer
+ tags[1]=rb.getString("calcMode.2");
+ tags[2]=rb.getString("calcMode.3");
+ createPropertyGroup("delay", new String[] { "throughput", "calcMode" });
PropertyDescriptor p= property("throughput");
p.setValue(NOT_UNDEFINED, Boolean.TRUE);
p.setValue(DEFAULT, new Double(0.0));
- p = property("legacyMode");
+ p = property("calcMode");
p.setValue(NOT_UNDEFINED,Boolean.TRUE);
- p.setValue(DEFAULT, Boolean.FALSE);
+ p.setValue(DEFAULT, tags[0]);
p.setValue(NOT_OTHER,Boolean.TRUE);
p.setValue(NOT_EXPRESSION,Boolean.TRUE);
+ p.setValue(TAGS,tags);
+ }
+ //TODO need to find better way to do this
+ public static int getCalcModeAsInt(String mode)
+ {
+ for (int i = 0; i < tags.length ; i++)
+ {
+ if (tags[i].equals(mode)) return i;
+ }
+ return -1;
}
}
\ No newline at end of file
1.25 +24 -6 jakarta-jmeter/src/core/org/apache/jmeter/threads/ThreadGroup.java
Index: ThreadGroup.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/threads/ThreadGroup.java,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- ThreadGroup.java 18 Feb 2004 23:53:33 -0000 1.24
+++ ThreadGroup.java 28 May 2005 20:52:06 -0000 1.25
@@ -1,6 +1,6 @@
// $Header$
/*
- * Copyright 2001-2004 The Apache Software Foundation.
+ * Copyright 2001-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -50,7 +50,7 @@
extends AbstractTestElement
implements SampleListener, Serializable, Controller
{
- private static Logger log = LoggingManager.getLoggerForClass();
+ private final static Logger log = LoggingManager.getLoggerForClass();
public final static String NUM_THREADS = "ThreadGroup.num_threads";
public final static String RAMP_TIME = "ThreadGroup.ramp_time";
@@ -75,6 +75,8 @@
private LinkedList listeners = new LinkedList();
private LinkedList remoteListeners = new LinkedList();
+ private int numberOfThreads=0; // Number of threads currently running in this group
+
/**
* No-arg constructor.
*/
@@ -83,7 +85,7 @@
}
/**
- * Set the nuber of threads.
+ * Set the number of threads to start
*
* @param numThreads the number of threads.
*/
@@ -92,6 +94,22 @@
setProperty(new IntegerProperty(NUM_THREADS, numThreads));
}
+ synchronized void incrNumberOfThreads()
+ {
+ numberOfThreads++;
+ }
+
+ synchronized void decrNumberOfThreads()
+ {
+ numberOfThreads--;
+ }
+
+ public synchronized int getNumberOfThreads()
+ {
+ return numberOfThreads;
+ }
+
+
public boolean isDone()
{
return getSamplerController().isDone();
1.59 +16 -7 jakarta-jmeter/src/core/org/apache/jmeter/threads/JMeterThread.java
Index: JMeterThread.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/threads/JMeterThread.java,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -r1.58 -r1.59
--- JMeterThread.java 18 Mar 2005 15:26:58 -0000 1.58
+++ JMeterThread.java 28 May 2005 20:52:06 -0000 1.59
@@ -18,11 +18,9 @@
package org.apache.jmeter.threads;
import java.util.Collection;
-import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
-import java.util.Map;
import org.apache.jmeter.assertions.Assertion;
import org.apache.jmeter.assertions.AssertionResult;
@@ -51,13 +49,12 @@
* The JMeter interface to the sampling process, allowing JMeter to see the
* timing, add listeners for sampling events and to stop the sampling process.
*
- * @author unattributed
* @version $Revision$ Last updated: $Date$
*/
public class JMeterThread implements Runnable, java.io.Serializable
{
transient private static Logger log = LoggingManager.getLoggerForClass();
- private static Map samplers = new HashMap();
+ //NOT USED private static Map samplers = new HashMap();
private int initialDelay = 0;
private Controller controller;
private boolean running;
@@ -75,6 +72,8 @@
private boolean scheduler = false;
//based on this scheduler is enabled or disabled
+ private ThreadGroup threadGroup; // Gives access to parent thread threadGroup
+
private StandardJMeterEngine engine = null; // For access to stop methods.
private boolean onErrorStopTest;
@@ -331,6 +330,7 @@
protected void initRun()
{
JMeterContextService.incrNumberOfThreads();
+ threadGroup.incrNumberOfThreads();
threadContext = JMeterContextService.getContext();
threadContext.setVariables(threadVars);
threadContext.setThreadNum(getThreadNum());
@@ -372,6 +372,7 @@
Traverser shut = new Traverser(false);
testTree.traverse(shut);
JMeterContextService.decrNumberOfThreads();
+ threadGroup.decrNumberOfThreads();
}
private class Traverser implements HashTreeTraverser
@@ -529,7 +530,7 @@
}
/**
- * Initial delay if ramp-up period is active for this group.
+ * Initial delay if ramp-up period is active for this threadGroup.
*/
private void rampUpDelay()
{
@@ -602,4 +603,12 @@
onErrorStopThread = b;
}
+ public ThreadGroup getThreadGroup() {
+ return threadGroup;
+ }
+
+ public void setThreadGroup(ThreadGroup group) {
+ this.threadGroup = group;
+ }
+
}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org