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