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 2011/11/13 16:12:43 UTC

svn commit: r1201437 - in /jmeter/trunk: bin/ src/core/org/apache/jmeter/samplers/ xdocs/

Author: pmouawad
Date: Sun Nov 13 15:12:43 2011
New Revision: 1201437

URL: http://svn.apache.org/viewvc?rev=1201437&view=rev
Log:
Bug 51886 - SampleSender configuration resolved partly on client and partly on server

Added:
    jmeter/trunk/src/core/org/apache/jmeter/samplers/AbstractSampleSender.java   (with props)
Modified:
    jmeter/trunk/bin/jmeter.properties
    jmeter/trunk/src/core/org/apache/jmeter/samplers/AsynchSampleSender.java
    jmeter/trunk/src/core/org/apache/jmeter/samplers/BatchSampleSender.java
    jmeter/trunk/src/core/org/apache/jmeter/samplers/DataStrippingSampleSender.java
    jmeter/trunk/src/core/org/apache/jmeter/samplers/HoldSampleSender.java
    jmeter/trunk/src/core/org/apache/jmeter/samplers/StandardSampleSender.java
    jmeter/trunk/src/core/org/apache/jmeter/samplers/StatisticalSampleSender.java
    jmeter/trunk/xdocs/changes.xml

Modified: jmeter/trunk/bin/jmeter.properties
URL: http://svn.apache.org/viewvc/jmeter/trunk/bin/jmeter.properties?rev=1201437&r1=1201436&r2=1201437&view=diff
==============================================================================
--- jmeter/trunk/bin/jmeter.properties (original)
+++ jmeter/trunk/bin/jmeter.properties Sun Nov 13 15:12:43 2011
@@ -530,6 +530,10 @@ wmlParser.types=text/vnd.wap.wml 
 #---------------------------------------------------------------------------
 # Remote batching configuration
 #---------------------------------------------------------------------------
+# How is Sample sender implementations configured:
+# - true (default) means client configuration will be used
+# - false means server configuration will be used
+sample_sender_client_configured=false
 
 # Remote batching support
 # default is Standard, which returns each sample synchronously

Added: jmeter/trunk/src/core/org/apache/jmeter/samplers/AbstractSampleSender.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/samplers/AbstractSampleSender.java?rev=1201437&view=auto
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/samplers/AbstractSampleSender.java (added)
+++ jmeter/trunk/src/core/org/apache/jmeter/samplers/AbstractSampleSender.java Sun Nov 13 15:12:43 2011
@@ -0,0 +1,42 @@
+/*
+ * 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.samplers;
+
+import org.apache.jmeter.util.JMeterUtils;
+
+/**
+ * Base class for SampleSender implementations
+ */
+public abstract class AbstractSampleSender implements SampleSender {
+    private final boolean isClientConfigured = JMeterUtils.getPropDefault("sample_sender_client_configured", true); // $NON-NLS-1$
+
+	/**
+	 * @return boolean indicates how SampleSender configuration is done, true means use client properties and send to servers, false means use server configurations
+	 */
+	public boolean isClientConfigured() {
+		return isClientConfigured;
+	}
+
+	/**
+	 * 
+	 */
+	public AbstractSampleSender() {
+		super();
+	}
+}

Propchange: jmeter/trunk/src/core/org/apache/jmeter/samplers/AbstractSampleSender.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: jmeter/trunk/src/core/org/apache/jmeter/samplers/AsynchSampleSender.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/samplers/AsynchSampleSender.java?rev=1201437&r1=1201436&r2=1201437&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/samplers/AsynchSampleSender.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/samplers/AsynchSampleSender.java Sun Nov 13 15:12:43 2011
@@ -31,7 +31,7 @@ import org.apache.jorphan.logging.Loggin
 import org.apache.jorphan.util.JMeterError;
 import org.apache.log.Logger;
 
-public class AsynchSampleSender implements SampleSender, Serializable {
+public class AsynchSampleSender extends AbstractSampleSender implements Serializable {
 
     private static final long serialVersionUID = 251L;
 
@@ -39,16 +39,14 @@ public class AsynchSampleSender implemen
 
     // Create unique object as marker for end of queue
     private transient static final SampleEvent FINAL_EVENT = new SampleEvent();
+
+    private static final int serverConfiguredCapacity = JMeterUtils.getPropDefault("asynch.batch.queue.size", 100); // $NON-NLS-1$
     
-    private static final int capacity = JMeterUtils.getPropDefault("asynch.batch.queue.size", 100); // $NON-NLS-1$
+    private final int clientConfiguredCapacity = JMeterUtils.getPropDefault("asynch.batch.queue.size", 100); // $NON-NLS-1$
 
     // created by client 
     private final RemoteSampleListener listener;
 
-    static {
-        log.info("Using Asynch Remote Sampler for this test run, queue size "+capacity);        
-    }
-
     private transient BlockingQueue<SampleEvent> queue; // created by server in readResolve method
     
     private transient long queueWaits; // how many times we had to wait to queue a sample
@@ -60,6 +58,7 @@ public class AsynchSampleSender implemen
      * @throws ObjectStreamException  
      */
     private Object readResolve() throws ObjectStreamException{
+    	int capacity = getCapacity();
         log.debug("Using batch queue size (asynch.batch.queue.size): " + capacity);
         queue = new ArrayBlockingQueue<SampleEvent>(capacity);        
         Worker worker = new Worker(queue, listener);
@@ -73,15 +72,24 @@ public class AsynchSampleSender implemen
      */
     @Deprecated
     public AsynchSampleSender(){
+    	this(null);
         log.warn("Constructor only intended for use in testing"); // $NON-NLS-1$
-        listener = null;
     }
 
     // Created by SampleSenderFactory
     protected AsynchSampleSender(RemoteSampleListener listener) {
         this.listener = listener;
+        log.info("Using Asynch Remote Sampler for this test run, queue size "+getCapacity());  
     }
 
+    /**
+     * @return capacity
+     */
+    private int getCapacity() {
+    	return isClientConfigured() ? 
+    			clientConfiguredCapacity : serverConfiguredCapacity;
+    }
+    
     public void testEnded() { // probably not used in server mode
         log.debug("Test ended()");
         try {

Modified: jmeter/trunk/src/core/org/apache/jmeter/samplers/BatchSampleSender.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/samplers/BatchSampleSender.java?rev=1201437&r1=1201436&r2=1201437&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/samplers/BatchSampleSender.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/samplers/BatchSampleSender.java Sun Nov 13 15:12:43 2011
@@ -31,7 +31,7 @@ import java.io.Serializable;
  * Implements batch reporting for remote testing.
  *
  */
-public class BatchSampleSender implements SampleSender, Serializable {
+public class BatchSampleSender extends AbstractSampleSender implements Serializable {
     private static final Logger log = LoggingManager.getLoggerForClass();
 
     private static final long serialVersionUID = 240L;
@@ -40,31 +40,33 @@ public class BatchSampleSender implement
 
     private static final long DEFAULT_TIME_THRESHOLD = 60000L;
 
-    private static final int NUM_SAMPLES_THRESHOLD = 
-        JMeterUtils.getPropDefault("num_sample_threshold", DEFAULT_NUM_SAMPLE_THRESHOLD); // $NON-NLS-1$
+    private final int clientConfiguredNumSamplesThreshold = 
+            JMeterUtils.getPropDefault("num_sample_threshold", DEFAULT_NUM_SAMPLE_THRESHOLD); // $NON-NLS-1$
 
-    private static final long TIME_THRESHOLD_MS =
+    private final long clientConfiguredTimeThresholdMs =
+            JMeterUtils.getPropDefault("time_threshold", DEFAULT_TIME_THRESHOLD); // $NON-NLS-1$
+
+    private static final int serverConfiguredNumSamplesThreshold = 
+            JMeterUtils.getPropDefault("num_sample_threshold", DEFAULT_NUM_SAMPLE_THRESHOLD); // $NON-NLS-1$
+    
+    private static final long serverConfiguredTimeThresholdMs =
         JMeterUtils.getPropDefault("time_threshold", DEFAULT_TIME_THRESHOLD); // $NON-NLS-1$
 
+
     private final RemoteSampleListener listener;
 
     private final List<SampleEvent> sampleStore = new ArrayList<SampleEvent>();
 
     private long batchSendTime = -1;
 
-    static {
-        log.info("Using batching for this run."
-                + " Thresholds: num=" + NUM_SAMPLES_THRESHOLD
-                + ", time=" + TIME_THRESHOLD_MS);        
-    }
 
     /**
      * @deprecated only for use by test code
      */
     @Deprecated
     public BatchSampleSender(){
+    	this(null);
         log.warn("Constructor only intended for use in testing"); // $NON-NLS-1$
-        listener = null;
     }
     /**
      * Constructor
@@ -74,6 +76,9 @@ public class BatchSampleSender implement
      */
     protected BatchSampleSender(RemoteSampleListener listener) {
         this.listener = listener;
+        log.info("Using batching for this run."
+                + " Thresholds: num=" + getNumSamplesThreshold()
+                + ", time=" + getTimeThresholdMs()); 
     }
 
    /**
@@ -136,23 +141,25 @@ public class BatchSampleSender implement
      *            a Sample Event
      */
     public void sampleOccurred(SampleEvent e) {
+    	int numSamplesThreshold = getNumSamplesThreshold();
+    	long timeThresholdMs = getTimeThresholdMs();
         synchronized (sampleStore) {
             sampleStore.add(e);
             final int sampleCount = sampleStore.size();
 
             boolean sendNow = false;            
-            if (NUM_SAMPLES_THRESHOLD != -1) {
-                if (sampleCount >= NUM_SAMPLES_THRESHOLD) {
+            if (numSamplesThreshold != -1) {
+                if (sampleCount >= numSamplesThreshold) {
                     sendNow = true;
                 }
             }
 
             long now = 0;
-            if (TIME_THRESHOLD_MS != -1) {
+            if (timeThresholdMs != -1) {
                 now = System.currentTimeMillis();
                 // Checking for and creating initial timestamp to check against
                 if (batchSendTime == -1) {
-                    this.batchSendTime = now + TIME_THRESHOLD_MS;
+                    this.batchSendTime = now + timeThresholdMs;
                 }
                 if (batchSendTime < now && sampleCount > 0) {
                     sendNow = true;
@@ -164,8 +171,8 @@ public class BatchSampleSender implement
                     log.debug("Firing sample");
                     listener.processBatch(sampleStore);
                     sampleStore.clear();
-                    if (TIME_THRESHOLD_MS != -1) {
-                        this.batchSendTime = now + TIME_THRESHOLD_MS;
+                    if (timeThresholdMs != -1) {
+                        this.batchSendTime = now + timeThresholdMs;
                     }
                 } catch (RemoteException err) {
                     log.error("sampleOccurred", err);
@@ -173,4 +180,20 @@ public class BatchSampleSender implement
             }
         } // synchronized(sampleStore)
     }
+    
+    /**
+     * @return time in ms when a send will occur if limit is breached
+     */
+    private long getTimeThresholdMs() {
+    	return isClientConfigured() ?
+    			clientConfiguredTimeThresholdMs : serverConfiguredTimeThresholdMs;
+    }
+    
+    /**
+     * @return number of samples threshold over which results will be sent
+     */
+    private int getNumSamplesThreshold() {
+    	return isClientConfigured() ?
+    			clientConfiguredNumSamplesThreshold: serverConfiguredNumSamplesThreshold;
+    }
 }

Modified: jmeter/trunk/src/core/org/apache/jmeter/samplers/DataStrippingSampleSender.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/samplers/DataStrippingSampleSender.java?rev=1201437&r1=1201436&r2=1201437&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/samplers/DataStrippingSampleSender.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/samplers/DataStrippingSampleSender.java Sun Nov 13 15:12:43 2011
@@ -31,7 +31,7 @@ import org.apache.log.Logger;
  *
  *
  */
-public class DataStrippingSampleSender implements SampleSender, Serializable {
+public class DataStrippingSampleSender extends AbstractSampleSender implements Serializable {
     private static final long serialVersionUID = 1;
     private static final Logger log = LoggingManager.getLoggerForClass();
 

Modified: jmeter/trunk/src/core/org/apache/jmeter/samplers/HoldSampleSender.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/samplers/HoldSampleSender.java?rev=1201437&r1=1201436&r2=1201437&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/samplers/HoldSampleSender.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/samplers/HoldSampleSender.java Sun Nov 13 15:12:43 2011
@@ -30,7 +30,7 @@ import java.io.Serializable;
  * caching functionality (sampleStore).
  */
 
-public class HoldSampleSender implements SampleSender, Serializable {
+public class HoldSampleSender extends AbstractSampleSender implements Serializable {
     private static final Logger log = LoggingManager.getLoggerForClass();
 
     private static final long serialVersionUID = 240L;

Modified: jmeter/trunk/src/core/org/apache/jmeter/samplers/StandardSampleSender.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/samplers/StandardSampleSender.java?rev=1201437&r1=1201436&r2=1201437&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/samplers/StandardSampleSender.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/samplers/StandardSampleSender.java Sun Nov 13 15:12:43 2011
@@ -29,7 +29,7 @@ import java.io.Serializable;
  * Default behaviour for remote testing.
  */
 
-public class StandardSampleSender implements SampleSender, Serializable {
+public class StandardSampleSender extends AbstractSampleSender implements Serializable {
     private static final long serialVersionUID = 240L;
 
     private static final Logger log = LoggingManager.getLoggerForClass();

Modified: jmeter/trunk/src/core/org/apache/jmeter/samplers/StatisticalSampleSender.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/samplers/StatisticalSampleSender.java?rev=1201437&r1=1201436&r2=1201437&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/samplers/StatisticalSampleSender.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/samplers/StatisticalSampleSender.java Sun Nov 13 15:12:43 2011
@@ -33,7 +33,7 @@ import java.util.Map;
  * Implements batch reporting for remote testing.
  *
  */
-public class StatisticalSampleSender implements SampleSender, Serializable {
+public class StatisticalSampleSender extends AbstractSampleSender implements Serializable {
     private static final long serialVersionUID = 240L;
 
     private static final Logger log = LoggingManager.getLoggerForClass();
@@ -42,15 +42,24 @@ public class StatisticalSampleSender imp
 
     private static final long DEFAULT_TIME_THRESHOLD = 60000L;
 
-    private static final int NUM_SAMPLES_THRESHOLD = JMeterUtils.getPropDefault(
+    private final int clientConfiguredNumSamplesThreshold = JMeterUtils.getPropDefault(
             "num_sample_threshold", DEFAULT_NUM_SAMPLE_THRESHOLD);
 
-    private static final long TIME_THRESHOLD_MS = JMeterUtils.getPropDefault("time_threshold",
+    private final long clientConfiguredTimeThresholdMs = JMeterUtils.getPropDefault("time_threshold",
             DEFAULT_TIME_THRESHOLD);
 
     // should the samples be aggregated on thread name or thread group (default) ?
-    private static boolean KEY_ON_THREADNAME = JMeterUtils.getPropDefault("key_on_threadname", false);
+    private boolean clientConfiguredKeyOnThreadName = JMeterUtils.getPropDefault("key_on_threadname", false);
+
+    private static final int serverConfiguredNumSamplesThreshold = JMeterUtils.getPropDefault(
+            "num_sample_threshold", DEFAULT_NUM_SAMPLE_THRESHOLD);
+
+    private static final long serverConfiguredTimeThresholdMs = JMeterUtils.getPropDefault("time_threshold",
+            DEFAULT_TIME_THRESHOLD);
     
+    // should the samples be aggregated on thread name or thread group (default) ?
+    private static boolean serverConfiguredKeyOnThreadName = JMeterUtils.getPropDefault("key_on_threadname", false);
+
     private final RemoteSampleListener listener;
 
     private final List<SampleEvent> sampleStore = new ArrayList<SampleEvent>();
@@ -62,19 +71,13 @@ public class StatisticalSampleSender imp
 
     private long batchSendTime = -1;
 
-    static {
-        log.info("Using statistical sampling for this run." + " Thresholds: num="
-                + NUM_SAMPLES_THRESHOLD + ", time=" + TIME_THRESHOLD_MS
-                + ". Key uses ThreadName: " + KEY_ON_THREADNAME);        
-    }
-
     /**
      * @deprecated only for use by test code
      */
     @Deprecated
     public StatisticalSampleSender(){
+    	this(null);
         log.warn("Constructor only intended for use in testing");
-        listener = null;
     }
 
     /**
@@ -84,6 +87,10 @@ public class StatisticalSampleSender imp
      */
     StatisticalSampleSender(RemoteSampleListener listener) {
         this.listener = listener;
+        log.info("Using statistical sampling for this run." + " Thresholds: num="
+                + getNumSamplesThreshold() + ", time=" + getTimeThresholdMs()
+                + ". Key uses ThreadName: " + getKeyOnThreadName());        
+
     }
 
     /**
@@ -128,12 +135,15 @@ public class StatisticalSampleSender imp
      * @param e a Sample Event
      */
     public void sampleOccurred(SampleEvent e) {
-        synchronized (sampleStore) {
+    	int numSamplesThreshold = getNumSamplesThreshold();
+    	long timeThresholdMs = getTimeThresholdMs();
+    	boolean keyOnThreadName = getKeyOnThreadName();
+    	synchronized (sampleStore) {
             // Locate the statistical sample colector
-            String key = StatisticalSampleResult.getKey(e, KEY_ON_THREADNAME);
+            String key = StatisticalSampleResult.getKey(e, keyOnThreadName);
             StatisticalSampleResult statResult = sampleTable.get(key);
             if (statResult == null) {
-                statResult = new StatisticalSampleResult(e.getResult(), KEY_ON_THREADNAME);
+                statResult = new StatisticalSampleResult(e.getResult(), keyOnThreadName);
                 // store the new statistical result collector
                 sampleTable.put(key, statResult);
                 // add a new wrapper samplevent
@@ -143,18 +153,18 @@ public class StatisticalSampleSender imp
             statResult.add(e.getResult());
             sampleCount++;
             boolean sendNow = false;
-            if (NUM_SAMPLES_THRESHOLD != -1) {
-                if (sampleCount >= NUM_SAMPLES_THRESHOLD) {
+            if (numSamplesThreshold != -1) {
+                if (sampleCount >= numSamplesThreshold) {
                     sendNow = true;
                 }
             }
 
             long now = 0;
-            if (TIME_THRESHOLD_MS != -1) {
+            if (timeThresholdMs != -1) {
                 now = System.currentTimeMillis();
                 // Checking for and creating initial timestamp to check against
                 if (batchSendTime == -1) {
-                    this.batchSendTime = now + TIME_THRESHOLD_MS;
+                    this.batchSendTime = now + timeThresholdMs;
                 }
                 if (batchSendTime < now) {
                     sendNow = true;
@@ -166,8 +176,8 @@ public class StatisticalSampleSender imp
                         log.debug("Firing sample");
                     }
                     sendBatch();
-                    if (TIME_THRESHOLD_MS != -1) {
-                        this.batchSendTime = now + TIME_THRESHOLD_MS;
+                    if (timeThresholdMs != -1) {
+                        this.batchSendTime = now + timeThresholdMs;
                     }
                 } catch (RemoteException err) {
                     log.warn("sampleOccurred", err);
@@ -184,4 +194,28 @@ public class StatisticalSampleSender imp
             sampleCount = 0;
         }
     }
+    
+    /**
+     * @return time in ms when a send will occur if limit is breached
+     */
+    private long getTimeThresholdMs() {
+    	return isClientConfigured() ?
+    			clientConfiguredTimeThresholdMs : serverConfiguredTimeThresholdMs;
+    }
+    
+    /**
+     * @return number of samples threshold over which results will be sent
+     */
+    private int getNumSamplesThreshold() {
+    	return isClientConfigured() ?
+    			clientConfiguredNumSamplesThreshold: serverConfiguredNumSamplesThreshold;
+    }
+    
+    /**
+     * @return boolean indicating wether samples should be aggregated on thread name or thread group (default) ?
+     */
+    private boolean getKeyOnThreadName() {
+    	return isClientConfigured() ?
+    			clientConfiguredKeyOnThreadName: serverConfiguredKeyOnThreadName;
+    }
 }

Modified: jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1201437&r1=1201436&r2=1201437&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml (original)
+++ jmeter/trunk/xdocs/changes.xml Sun Nov 13 15:12:43 2011
@@ -80,6 +80,10 @@ Mirror server now uses default port 8081
 TCP Sampler handles SocketTimeoutException, SocketException and InterruptedIOException differently since 2.5.2, when
 these occurs, Sampler is marked as failed.
 </p>
+<p>
+Sample Sender implementations know resolve their configuration on Client side since 2.5.2.
+This behaviour can be changed with property sample_sender_client_configured (set it to false).
+</p>
 <!-- =================== Bug fixes =================== -->
 
 <h2>Bug fixes</h2>
@@ -208,6 +212,7 @@ these occurs, Sampler is marked as faile
 <li>Bug 52116 - Allow to add (paste) entries from the clipboard to an arguments list</li>
 <li>Bug 51091 - New function returning the name of the current "Test Plan"</li>
 <li>Bug 52160 - Don't display TestBeanGui items which are flagged as hidden</li>
+<li>Bug 51886 - SampleSender configuration resolved partly on client and partly on server</li>
 </ul>
 
 <h2>Non-functional changes</h2>