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 2007/09/22 20:14:54 UTC

svn commit: r578467 - in /jakarta/jmeter: branches/rel-2-2/bin/testfiles/ branches/rel-2-2/src/components/org/apache/jmeter/visualizers/ branches/rel-2-2/src/core/org/apache/jmeter/samplers/ branches/rel-2-2/src/core/org/apache/jmeter/save/ branches/re...

Author: sebb
Date: Sat Sep 22 11:14:53 2007
New Revision: 578467

URL: http://svn.apache.org/viewvc?rev=578467&view=rev
Log:
Bug 43450 - add save/restore of error count; fix Calculator to use error count

Modified:
    jakarta/jmeter/branches/rel-2-2/bin/testfiles/BatchTestLocal.csv
    jakarta/jmeter/branches/rel-2-2/bin/testfiles/BatchTestLocal.xml
    jakarta/jmeter/branches/rel-2-2/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
    jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/samplers/SampleResult.java
    jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/samplers/StatisticalSampleResult.java
    jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/save/OldSaveService.java
    jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/save/converters/SampleResultConverter.java
    jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/util/Calculator.java
    jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml
    jakarta/jmeter/trunk/bin/testfiles/BatchTestLocal.csv
    jakarta/jmeter/trunk/bin/testfiles/BatchTestLocal.xml
    jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/StatisticalSampleResult.java
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/OldSaveService.java
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/converters/SampleResultConverter.java
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/Calculator.java
    jakarta/jmeter/trunk/xdocs/changes.xml

Modified: jakarta/jmeter/branches/rel-2-2/bin/testfiles/BatchTestLocal.csv
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/bin/testfiles/BatchTestLocal.csv?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/bin/testfiles/BatchTestLocal.csv (original)
+++ jakarta/jmeter/branches/rel-2-2/bin/testfiles/BatchTestLocal.csv Sat Sep 22 11:14:53 2007
@@ -1,19 +1,19 @@
-label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,grpThreads,allThreads,URL,Filename,SampleCount
-Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1
-Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1
-Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1
-If Test,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Java If once 1,,,Thread Group 1-1,,false,,0,1,1,null,,1
-Java If once 2,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Java If all 1,,,Thread Group 1-1,,false,,0,1,1,null,,1
-Java OK,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Java If once 1,,,Thread Group 1-1,,false,,0,1,1,null,,1
-Java If once 2,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Java If all 1,,,Thread Group 1-1,,false,,0,1,1,null,,1
-Java OK,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
+label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,grpThreads,allThreads,URL,Filename,SampleCount,ErrorCount
+Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1,0
+Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1,0
+Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1,0
+If Test,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Java If once 1,,,Thread Group 1-1,,false,,0,1,1,null,,1,1
+Java If once 2,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Java If all 1,,,Thread Group 1-1,,false,,0,1,1,null,,1,1
+Java OK,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Java If once 1,,,Thread Group 1-1,,false,,0,1,1,null,,1,1
+Java If once 2,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Java If all 1,,,Thread Group 1-1,,false,,0,1,1,null,,1,1
+Java OK,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0

Modified: jakarta/jmeter/branches/rel-2-2/bin/testfiles/BatchTestLocal.xml
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/bin/testfiles/BatchTestLocal.xml?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/bin/testfiles/BatchTestLocal.xml (original)
+++ jakarta/jmeter/branches/rel-2-2/bin/testfiles/BatchTestLocal.xml Sat Sep 22 11:14:53 2007
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <testResults version="1.2">
-<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="10" sc="1" ng="1" na="1">
+<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="10" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String">ResultData</responseData>
@@ -8,7 +8,7 @@
   <samplerData class="java.lang.String">SamplerData</samplerData>
   <null/>
 </sample>
-<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="10" sc="1" ng="1" na="1">
+<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="10" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String">ResultData</responseData>
@@ -16,7 +16,7 @@
   <samplerData class="java.lang.String">SamplerData</samplerData>
   <null/>
 </sample>
-<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="10" sc="1" ng="1" na="1">
+<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="10" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String">ResultData</responseData>
@@ -24,105 +24,105 @@
   <samplerData class="java.lang.String">SamplerData</samplerData>
   <null/>
 </sample>
-<sample s="true" lb="If Test" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="If Test" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="false" lb="Java If once 1" rc="" rm="" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="false" lb="Java If once 1" rc="" rm="" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="1" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Java If once 2" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Java If once 2" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="false" lb="Java If all 1" rc="" rm="" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="false" lb="Java If all 1" rc="" rm="" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="1" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Java OK" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Java OK" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="false" lb="Java If once 1" rc="" rm="" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="false" lb="Java If once 1" rc="" rm="" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="1" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Java If once 2" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Java If once 2" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="false" lb="Java If all 1" rc="" rm="" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="false" lb="Java If all 1" rc="" rm="" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="1" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Java OK" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Java OK" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>

Modified: jakarta/jmeter/branches/rel-2-2/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java (original)
+++ jakarta/jmeter/branches/rel-2-2/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java Sat Sep 22 11:14:53 2007
@@ -364,6 +364,7 @@
 						statsBuff.append("Load time: ").append(res.getTime()).append(NL);
 						statsBuff.append("Size in bytes: ").append(res.getBytes()).append(NL);
 						statsBuff.append("Sample Count: ").append(res.getSampleCount()).append(NL);
+						statsBuff.append("Error Count: ").append(res.getErrorCount()).append(NL);
 						statsDoc.insertString(statsDoc.getLength(), statsBuff.toString(), null);
 						statsBuff = new StringBuffer(); //reset for reuse
 						

Modified: jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/samplers/SampleResult.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/samplers/SampleResult.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/samplers/SampleResult.java (original)
+++ jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/samplers/SampleResult.java Sat Sep 22 11:14:53 2007
@@ -820,13 +820,41 @@
 	/**
 	 * return the sample count. by default, the value is 1.
 	 * 
-	 * @return
+	 * @return the count of samples
 	 */
 	public int getSampleCount() {
 		return sampleCount;
 	}
 
 	/**
+	 * Returns the count of errors.
+	 * 
+	 * @return 0 - or 1 if the sample failed
+	 */
+	public int getErrorCount(){
+		return success ? 0 : 1;
+	}
+	
+	public void setErrorCount(int i){// for reading from CSV files
+		// ignored currently
+	}
+	/*
+	 * TODO: error counting needs to be sorted out after 2.3 final.
+	 * At present the Statistical Sampler tracks errors separately
+	 * It would make sense to move the error count here, but this would
+	 * mean lots of changes.
+	 * It's also tricky maintaining the count - it can't just be incremented/decremented
+	 * when the success flag is set as this may be done multiple times.
+	 * The work-round for now is to do the work in the StatisticalSampleResult,
+	 * which overrides this method.
+	 * Note that some JMS samplers also create samples with > 1 sample count
+	 * Also the Transaction Controller probably needs to be changed to do
+	 * proper sample and error accounting.
+	 * The purpose of this work-round is to allow at least minimal support for
+	 * errors in remote statistical batch mode.
+	 * 
+	 */
+	/**
 	 * In the event the sampler does want to pass back the actual contents, we
 	 * still want to calculate the throughput. The bytes is the bytes of the
 	 * response data.
@@ -840,7 +868,7 @@
 	/**
 	 * return the bytes returned by the response.
 	 * 
-	 * @return
+	 * @return number of bytes in response
 	 */
 	public int getBytes() {
 		return bytes == 0 ? responseData.length : bytes;

Modified: jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/samplers/StatisticalSampleResult.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/samplers/StatisticalSampleResult.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/samplers/StatisticalSampleResult.java (original)
+++ jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/samplers/StatisticalSampleResult.java Sat Sep 22 11:14:53 2007
@@ -21,23 +21,37 @@
 import java.io.Serializable;
 
 /**
- * @author Lars Krog-Jensen
- *         Created: 2005-okt-04
+ * Aggregates sample results for use by the Statistical remote batch mode.
+ * Samples are aggregated by the key defined by getKey().
+ * TODO: merge error count into parent class? 
  */
 public class StatisticalSampleResult extends SampleResult implements
 		Serializable {
     
-	private static final long serialVersionUID = 23L;
+	private static final long serialVersionUID = 24L;
 
 	private int errorCount;
 
     public StatisticalSampleResult(){// May be called by XStream
     }
     
+	/**
+	 * Allow OldSaveService to generate a suitable result when sample/error counts have been saved.
+	 * 
+	 * @deprecated Needs to be replaced when multiple sample results are sorted out
+	 * 
+	 * @param stamp
+	 * @param elapsed
+	 */
+	public StatisticalSampleResult(long stamp, long elapsed) {
+		super(stamp, elapsed);
+	}
+
 	public StatisticalSampleResult(SampleResult res) {
-		// Copy data that is shared between samples:
+		// Copy data that is shared between samples (i.e. the key items):
 		setSampleLabel(res.getSampleLabel());
 		setThreadName(res.getThreadName());
+
 		setSuccessful(true); // Assume result is OK
 		setSampleCount(0); // because we add the sample count in later
 	}
@@ -51,6 +65,7 @@
 		// Add Error Counter
 		if (!res.isSuccessful()) {
 			errorCount++;
+			this.setSuccessful(false);
 		}
 
 		// Set start/end times
@@ -73,14 +88,27 @@
 		return getEndTime();
 	}
 
-	public int getErrorCount() {
+	public int getErrorCount() {// Overrides SampleResult
 		return errorCount;
 	}
 
-	public static String getKey(SampleEvent event) {
-		String key = event.getResult().getSampleLabel() + "-"
-				+ event.getThreadGroup();
+	public void setErrorCount(int e) {// for reading CSV files
+		errorCount = e;
+	}
 
-		return key;
+	/**
+	 * Generates the key to be used for aggregating samples as follows:<br/>
+	 * <code>sampleLabel</code> "-" <code>threadGroup</code>
+	 * 
+	 * N.B. the key should agree with the fixed items that are saved in the sample.
+	 * 
+	 * @param event sample event whose key is to be calculated
+	 * @return the key to use for aggregating samples
+	 */
+	public static String getKey(SampleEvent event) {
+		SampleResult result = event.getResult();
+		StringBuffer sb = new StringBuffer(80);
+		sb.append(result.getSampleLabel()).append("-").append(result.getThreadName());
+		return sb.toString();
 	}
 }

Modified: jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/save/OldSaveService.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/save/OldSaveService.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/save/OldSaveService.java (original)
+++ jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/save/OldSaveService.java Sat Sep 22 11:14:53 2007
@@ -43,6 +43,7 @@
 import org.apache.jmeter.assertions.AssertionResult;
 import org.apache.jmeter.samplers.SampleResult;
 import org.apache.jmeter.samplers.SampleSaveConfiguration;
+import org.apache.jmeter.samplers.StatisticalSampleResult;
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.testelement.property.CollectionProperty;
 import org.apache.jmeter.testelement.property.JMeterProperty;
@@ -101,6 +102,7 @@
     private static final String CSV_THREAD_COUNT1 = "grpThreads"; // $NON-NLS-1$
     private static final String CSV_THREAD_COUNT2 = "allThreads"; // $NON-NLS-1$
     private static final String CSV_SAMPLE_COUNT = "SampleCount"; // $NON-NLS-1$
+    private static final String CSV_ERROR_COUNT = "ErrorCount"; // $NON-NLS-1$
     private static final String CSV_URL = "URL"; // $NON-NLS-1$
     private static final String CSV_FILENAME = "Filename"; // $NON-NLS-1$
     private static final String CSV_LATENCY = "Latency"; // $NON-NLS-1$
@@ -185,7 +187,11 @@
 				elapsed = Long.parseLong(text);
 			}
 
-			result = new SampleResult(timeStamp, elapsed);
+			if (saveConfig.saveSampleCount()) {
+				result = new StatisticalSampleResult(timeStamp, elapsed);
+			} else {
+				result = new SampleResult(timeStamp, elapsed);
+			}
 
 			if (saveConfig.saveLabel()) {
 				field = LABEL;
@@ -260,10 +266,13 @@
                 result.setEncodingAndType(text);
             }
 
-            if (saveConfig.saveEncoding()) {
+            if (saveConfig.saveSampleCount()) {
             	field = CSV_SAMPLE_COUNT;
                 text = parts[i++];
                 result.setSampleCount(Integer.parseInt(text));
+            	field = CSV_ERROR_COUNT;
+                text = parts[i++];
+                result.setErrorCount(Integer.parseInt(text));
             }
 
             
@@ -378,6 +387,8 @@
 		if (saveConfig.saveSampleCount()) {
 			text.append(CSV_SAMPLE_COUNT);
 			text.append(delim);
+			text.append(CSV_ERROR_COUNT);
+			text.append(delim);
 		}
 
 		String resultString = null;
@@ -414,7 +425,9 @@
             // Both these are needed in the list even though they set the same variable
             headerLabelMethods.put(CSV_THREAD_COUNT1,new Functor("setThreadCounts"));
             headerLabelMethods.put(CSV_THREAD_COUNT2,new Functor("setThreadCounts"));
+            // Both these are needed in the list even though they set the same variable
             headerLabelMethods.put(CSV_SAMPLE_COUNT, new Functor("setSampleCount"));
+            headerLabelMethods.put(CSV_ERROR_COUNT, new Functor("setSampleCount"));
 	}
 
 	/**
@@ -592,8 +605,10 @@
             text.append(delimiter);
         }
 
-    	if (saveConfig.saveSampleCount()) {
+    	if (saveConfig.saveSampleCount()) {// Need both sample and error count to be any use
     		text.append(sample.getSampleCount());
+    		text.append(delimiter);
+    		text.append(sample.getErrorCount());
     		text.append(delimiter);
     	}
     

Modified: jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/save/converters/SampleResultConverter.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/save/converters/SampleResultConverter.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/save/converters/SampleResultConverter.java (original)
+++ jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/save/converters/SampleResultConverter.java Sat Sep 22 11:14:53 2007
@@ -64,6 +64,7 @@
     private static final String ATT_BYTES             = "by"; //$NON-NLS-1$
     private static final String ATT_DATA_ENCODING     = "de"; //$NON-NLS-1$
     private static final String ATT_DATA_TYPE         = "dt"; //$NON-NLS-1$
+    private static final String ATT_ERROR_COUNT      = "ec"; //$NON-NLS-1$
     private static final String ATT_LABEL             = "lb"; //$NON-NLS-1$
     private static final String ATT_LATENCY           = "lt"; //$NON-NLS-1$
 
@@ -251,6 +252,7 @@
 			writer.addAttribute(ATT_BYTES, String.valueOf(res.getBytes()));
         if (save.saveSampleCount()){
         	writer.addAttribute(ATT_SAMPLE_COUNT, String.valueOf(res.getSampleCount()));
+        	writer.addAttribute(ATT_ERROR_COUNT, String.valueOf(res.getErrorCount()));
         }
         if (save.saveThreadCounts()){// These cannot be restored
         	org.apache.jmeter.threads.ThreadGroup 
@@ -362,6 +364,7 @@
 		res.setLatency(Converter.getLong(reader.getAttribute(ATT_LATENCY)));
 		res.setBytes(Converter.getInt(reader.getAttribute(ATT_BYTES)));
 		res.setSampleCount(Converter.getInt(reader.getAttribute(ATT_SAMPLE_COUNT),1)); // default is 1
+		res.setErrorCount(Converter.getInt(reader.getAttribute(ATT_ERROR_COUNT),0)); // default is 0
         // ATT_GRP_THRDS and ATT_ALL_THRDS are write only
 	}
 

Modified: jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/util/Calculator.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/util/Calculator.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/util/Calculator.java (original)
+++ jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/util/Calculator.java Sat Sep 22 11:14:53 2007
@@ -94,7 +94,7 @@
     public void addSample(SampleResult res) {
         addBytes(res.getBytes());
         addValue(res.getTime(),res.getSampleCount());
-        if (!res.isSuccessful()) errors++;
+        errors+=res.getErrorCount(); // account for multiple samples
         if (startTime == 0){
             startTime=res.getStartTime();
         }
@@ -170,7 +170,7 @@
      * calculates the average page size, which means divide the bytes by number
      * of samples.
      * 
-     * @return
+     * @return average page size
      */
     public double getPageSize() {
         if (count > 0 && bytes > 0) {
@@ -182,11 +182,11 @@
     /**
      * Throughput in bytes / second
      * 
-     * @return
+     * @return throughput in bytes/second
      */
     public double getBytesPerSecond() {
         if (elapsedTime > 0) {
-            return bytes / ((double) elapsedTime / 1000);
+            return bytes / ((double) elapsedTime / 1000); // 1000 = millisecs/sec
         }
         return 0.0;
     }
@@ -194,10 +194,10 @@
     /**
      * Throughput in kilobytes / second
      * 
-     * @return
+     * @return Throughput in kilobytes / second
      */
     public double getKBPerSecond() {
-        return getBytesPerSecond() / 1024;
+        return getBytesPerSecond() / 1024; // 1024=bytes per kb
     }
 
 }

Modified: jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml (original)
+++ jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml Sat Sep 22 11:14:53 2007
@@ -40,7 +40,7 @@
 <li>Fixup broken jmeter-server script</li>
 <li>Bug 43364 - option to revert If Controller to pre 2.3RC3 behaviour</li>
 <li>Bug 43449 - Statistical Remote mode does not handle Latency</li>
-<li>Bug 43450 (partial fix) - Allow SampleCount to be saved/restored from files</li>
+<li>Bug 43450 (partial fix) - Allow SampleCount and ErrorCount to be saved to/restored from files</li>
 </ul>
 
 <h4>Improvements</h4>

Modified: jakarta/jmeter/trunk/bin/testfiles/BatchTestLocal.csv
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/bin/testfiles/BatchTestLocal.csv?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/trunk/bin/testfiles/BatchTestLocal.csv (original)
+++ jakarta/jmeter/trunk/bin/testfiles/BatchTestLocal.csv Sat Sep 22 11:14:53 2007
@@ -1,19 +1,19 @@
-label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,grpThreads,allThreads,URL,Filename,SampleCount
-Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1
-Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1
-Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1
-If Test,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Java If once 1,,,Thread Group 1-1,,false,,0,1,1,null,,1
-Java If once 2,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Java If all 1,,,Thread Group 1-1,,false,,0,1,1,null,,1
-Java OK,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Java If once 1,,,Thread Group 1-1,,false,,0,1,1,null,,1
-Java If once 2,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
-Java If all 1,,,Thread Group 1-1,,false,,0,1,1,null,,1
-Java OK,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1
+label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,grpThreads,allThreads,URL,Filename,SampleCount,ErrorCount
+Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1,0
+Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1,0
+Java 1,200,OK,Thread Group 1-1,text,true,,10,1,1,null,,1,0
+If Test,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Loop,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Module,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Java If once 1,,,Thread Group 1-1,,false,,0,1,1,null,,1,1
+Java If once 2,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Java If all 1,,,Thread Group 1-1,,false,,0,1,1,null,,1,1
+Java OK,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Java If once 1,,,Thread Group 1-1,,false,,0,1,1,null,,1,1
+Java If once 2,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0
+Java If all 1,,,Thread Group 1-1,,false,,0,1,1,null,,1,1
+Java OK,200,OK,Thread Group 1-1,,true,,0,1,1,null,,1,0

Modified: jakarta/jmeter/trunk/bin/testfiles/BatchTestLocal.xml
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/bin/testfiles/BatchTestLocal.xml?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/trunk/bin/testfiles/BatchTestLocal.xml (original)
+++ jakarta/jmeter/trunk/bin/testfiles/BatchTestLocal.xml Sat Sep 22 11:14:53 2007
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <testResults version="1.2">
-<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="10" sc="1" ng="1" na="1">
+<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="10" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String">ResultData</responseData>
@@ -8,7 +8,7 @@
   <samplerData class="java.lang.String">SamplerData</samplerData>
   <null/>
 </sample>
-<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="10" sc="1" ng="1" na="1">
+<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="10" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String">ResultData</responseData>
@@ -16,7 +16,7 @@
   <samplerData class="java.lang.String">SamplerData</samplerData>
   <null/>
 </sample>
-<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="10" sc="1" ng="1" na="1">
+<sample s="true" lb="Java 1" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="10" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String">ResultData</responseData>
@@ -24,105 +24,105 @@
   <samplerData class="java.lang.String">SamplerData</samplerData>
   <null/>
 </sample>
-<sample s="true" lb="If Test" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="If Test" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Loop" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Module" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="false" lb="Java If once 1" rc="" rm="" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="false" lb="Java If once 1" rc="" rm="" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="1" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Java If once 2" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Java If once 2" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="false" lb="Java If all 1" rc="" rm="" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="false" lb="Java If all 1" rc="" rm="" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="1" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Java OK" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Java OK" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="false" lb="Java If once 1" rc="" rm="" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="false" lb="Java If once 1" rc="" rm="" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="1" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Java If once 2" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Java If once 2" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="false" lb="Java If all 1" rc="" rm="" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="false" lb="Java If all 1" rc="" rm="" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="1" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>
   <responseFile class="java.lang.String"></responseFile>
   <null/>
 </sample>
-<sample s="true" lb="Java OK" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ng="1" na="1">
+<sample s="true" lb="Java OK" rc="200" rm="OK" tn="Thread Group 1-1" dt="" by="0" sc="1" ec="0" ng="1" na="1">
   <responseHeader class="java.lang.String"></responseHeader>
   <requestHeader class="java.lang.String"></requestHeader>
   <responseData class="java.lang.String"/>

Modified: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java (original)
+++ jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java Sat Sep 22 11:14:53 2007
@@ -364,6 +364,7 @@
 						statsBuff.append("Load time: ").append(res.getTime()).append(NL);
 						statsBuff.append("Size in bytes: ").append(res.getBytes()).append(NL);
 						statsBuff.append("Sample Count: ").append(res.getSampleCount()).append(NL);
+						statsBuff.append("Error Count: ").append(res.getErrorCount()).append(NL);
 						statsDoc.insertString(statsDoc.getLength(), statsBuff.toString(), null);
 						statsBuff = new StringBuffer(); //reset for reuse
 						

Modified: jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java (original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java Sat Sep 22 11:14:53 2007
@@ -834,6 +834,34 @@
 	}
 
 	/**
+	 * Returns the count of errors.
+	 * 
+	 * @return 0 - or 1 if the sample failed
+	 */
+	public int getErrorCount(){
+		return success ? 0 : 1;
+	}
+	
+	public void setErrorCount(int i){// for reading from CSV files
+		// ignored currently
+	}
+	/*
+	 * TODO: error counting needs to be sorted out after 2.3 final.
+	 * At present the Statistical Sampler tracks errors separately
+	 * It would make sense to move the error count here, but this would
+	 * mean lots of changes.
+	 * It's also tricky maintaining the count - it can't just be incremented/decremented
+	 * when the success flag is set as this may be done multiple times.
+	 * The work-round for now is to do the work in the StatisticalSampleResult,
+	 * which overrides this method.
+	 * Note that some JMS samplers also create samples with > 1 sample count
+	 * Also the Transaction Controller probably needs to be changed to do
+	 * proper sample and error accounting.
+	 * The purpose of this work-round is to allow at least minimal support for
+	 * errors in remote statistical batch mode.
+	 * 
+	 */
+	/**
 	 * In the event the sampler does want to pass back the actual contents, we
 	 * still want to calculate the throughput. The bytes is the bytes of the
 	 * response data.

Modified: jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/StatisticalSampleResult.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/StatisticalSampleResult.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/StatisticalSampleResult.java (original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/StatisticalSampleResult.java Sat Sep 22 11:14:53 2007
@@ -21,23 +21,37 @@
 import java.io.Serializable;
 
 /**
- * @author Lars Krog-Jensen
- *         Created: 2005-okt-04
+ * Aggregates sample results for use by the Statistical remote batch mode.
+ * Samples are aggregated by the key defined by getKey().
+ * TODO: merge error count into parent class? 
  */
 public class StatisticalSampleResult extends SampleResult implements
 		Serializable {
    
-	private static final long serialVersionUID = 23L;
+	private static final long serialVersionUID = 24L;
 
 	private int errorCount;
 
     public StatisticalSampleResult(){// May be called by XStream
     }
     
+	/**
+	 * Allow OldSaveService to generate a suitable result when sample/error counts have been saved.
+	 * 
+	 * @deprecated Needs to be replaced when multiple sample results are sorted out
+	 * 
+	 * @param stamp
+	 * @param elapsed
+	 */
+	public StatisticalSampleResult(long stamp, long elapsed) {
+		super(stamp, elapsed);
+	}
+
 	public StatisticalSampleResult(SampleResult res) {
-		// Copy data that is shared between samples:
+		// Copy data that is shared between samples (i.e. the key items):
 		setSampleLabel(res.getSampleLabel());
 		setThreadName(res.getThreadName());
+
 		setSuccessful(true); // Assume result is OK
 		setSampleCount(0); // because we add the sample count in later
 	}
@@ -51,6 +65,7 @@
 		// Add Error Counter
 		if (!res.isSuccessful()) {
 			errorCount++;
+			this.setSuccessful(false);
 		}
 
 		// Set start/end times
@@ -73,14 +88,27 @@
 		return getEndTime();
 	}
 
-	public int getErrorCount() {
+	public int getErrorCount() {// Overrides SampleResult
 		return errorCount;
 	}
 
-	public static String getKey(SampleEvent event) {
-		String key = event.getResult().getSampleLabel() + "-"
-				+ event.getThreadGroup();
+	public void setErrorCount(int e) {// for reading CSV files
+		errorCount = e;
+	}
 
-		return key;
+	/**
+	 * Generates the key to be used for aggregating samples as follows:<br/>
+	 * <code>sampleLabel</code> "-" <code>threadGroup</code>
+	 * 
+	 * N.B. the key should agree with the fixed items that are saved in the sample.
+	 * 
+	 * @param event sample event whose key is to be calculated
+	 * @return the key to use for aggregating samples
+	 */
+	public static String getKey(SampleEvent event) {
+		SampleResult result = event.getResult();
+		StringBuffer sb = new StringBuffer(80);
+		sb.append(result.getSampleLabel()).append("-").append(result.getThreadName());
+		return sb.toString();
 	}
 }

Modified: jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/OldSaveService.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/OldSaveService.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/OldSaveService.java (original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/OldSaveService.java Sat Sep 22 11:14:53 2007
@@ -43,6 +43,7 @@
 import org.apache.jmeter.assertions.AssertionResult;
 import org.apache.jmeter.samplers.SampleResult;
 import org.apache.jmeter.samplers.SampleSaveConfiguration;
+import org.apache.jmeter.samplers.StatisticalSampleResult;
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.testelement.property.CollectionProperty;
 import org.apache.jmeter.testelement.property.JMeterProperty;
@@ -100,6 +101,7 @@
     private static final String CSV_THREAD_COUNT1 = "grpThreads"; // $NON-NLS-1$
     private static final String CSV_THREAD_COUNT2 = "allThreads"; // $NON-NLS-1$
     private static final String CSV_SAMPLE_COUNT = "SampleCount"; // $NON-NLS-1$
+    private static final String CSV_ERROR_COUNT = "ErrorCount"; // $NON-NLS-1$
     private static final String CSV_URL = "URL"; // $NON-NLS-1$
     private static final String CSV_FILENAME = "Filename"; // $NON-NLS-1$
     private static final String CSV_LATENCY = "Latency"; // $NON-NLS-1$
@@ -184,7 +186,11 @@
 				elapsed = Long.parseLong(text);
 			}
 
-			result = new SampleResult(timeStamp, elapsed);
+			if (saveConfig.saveSampleCount()) {
+				result = new StatisticalSampleResult(timeStamp, elapsed);
+			} else {
+				result = new SampleResult(timeStamp, elapsed);
+			}
 
 			if (saveConfig.saveLabel()) {
 				field = LABEL;
@@ -264,10 +270,13 @@
                 result.setEncodingAndType(text);
             }
 
-            if (saveConfig.saveEncoding()) {
+            if (saveConfig.saveSampleCount()) {
             	field = CSV_SAMPLE_COUNT;
                 text = parts[i++];
                 result.setSampleCount(Integer.parseInt(text));
+            	field = CSV_ERROR_COUNT;
+                text = parts[i++];
+                result.setErrorCount(Integer.parseInt(text));
             }
 
             
@@ -382,6 +391,8 @@
 		if (saveConfig.saveSampleCount()) {
 			text.append(CSV_SAMPLE_COUNT);
 			text.append(delim);
+			text.append(CSV_ERROR_COUNT);
+			text.append(delim);
 		}
 
 		String resultString = null;
@@ -418,7 +429,9 @@
             // Both these are needed in the list even though they set the same variable
             headerLabelMethods.put(CSV_THREAD_COUNT1,new Functor("setThreadCounts"));
             headerLabelMethods.put(CSV_THREAD_COUNT2,new Functor("setThreadCounts"));
+            // Both these are needed in the list even though they set the same variable
             headerLabelMethods.put(CSV_SAMPLE_COUNT, new Functor("setSampleCount"));
+            headerLabelMethods.put(CSV_ERROR_COUNT, new Functor("setSampleCount"));
 	}
 
 	/**
@@ -590,8 +603,10 @@
             text.append(delimiter);
         }
 
-    	if (saveConfig.saveSampleCount()) {
+    	if (saveConfig.saveSampleCount()) {// Need both sample and error count to be any use
     		text.append(sample.getSampleCount());
+    		text.append(delimiter);
+    		text.append(sample.getErrorCount());
     		text.append(delimiter);
     	}
     

Modified: jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/converters/SampleResultConverter.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/converters/SampleResultConverter.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/converters/SampleResultConverter.java (original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/converters/SampleResultConverter.java Sat Sep 22 11:14:53 2007
@@ -63,6 +63,7 @@
     private static final String ATT_BYTES             = "by"; //$NON-NLS-1$
     private static final String ATT_DATA_ENCODING     = "de"; //$NON-NLS-1$
     private static final String ATT_DATA_TYPE         = "dt"; //$NON-NLS-1$
+    private static final String ATT_ERROR_COUNT      = "ec"; //$NON-NLS-1$
     private static final String ATT_LABEL             = "lb"; //$NON-NLS-1$
     private static final String ATT_LATENCY           = "lt"; //$NON-NLS-1$
 
@@ -250,6 +251,7 @@
 			writer.addAttribute(ATT_BYTES, String.valueOf(res.getBytes()));
         if (save.saveSampleCount()){
         	writer.addAttribute(ATT_SAMPLE_COUNT, String.valueOf(res.getSampleCount()));
+        	writer.addAttribute(ATT_ERROR_COUNT, String.valueOf(res.getErrorCount()));
         }
         if (save.saveThreadCounts()){
            writer.addAttribute(ATT_GRP_THRDS, String.valueOf(res.getGroupThreads()));
@@ -353,6 +355,7 @@
 		res.setLatency(Converter.getLong(reader.getAttribute(ATT_LATENCY)));
 		res.setBytes(Converter.getInt(reader.getAttribute(ATT_BYTES)));
 		res.setSampleCount(Converter.getInt(reader.getAttribute(ATT_SAMPLE_COUNT),1)); // default is 1
+		res.setErrorCount(Converter.getInt(reader.getAttribute(ATT_ERROR_COUNT),0)); // default is 0
 		res.setGroupThreads(Converter.getInt(reader.getAttribute(ATT_GRP_THRDS)));
 		res.setAllThreads(Converter.getInt(reader.getAttribute(ATT_ALL_THRDS)));
 	}

Modified: jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/Calculator.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/Calculator.java?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/Calculator.java (original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/Calculator.java Sat Sep 22 11:14:53 2007
@@ -94,7 +94,7 @@
     public void addSample(SampleResult res) {
         addBytes(res.getBytes());
         addValue(res.getTime(),res.getSampleCount());
-        if (!res.isSuccessful()) errors++;
+        errors+=res.getErrorCount(); // account for multiple samples
         if (startTime == 0){
             startTime=res.getStartTime();
         }
@@ -170,7 +170,7 @@
      * calculates the average page size, which means divide the bytes by number
      * of samples.
      * 
-     * @return
+     * @return average page size
      */
     public double getPageSize() {
         if (count > 0 && bytes > 0) {
@@ -182,11 +182,11 @@
     /**
      * Throughput in bytes / second
      * 
-     * @return
+     * @return throughput in bytes/second
      */
     public double getBytesPerSecond() {
         if (elapsedTime > 0) {
-            return bytes / ((double) elapsedTime / 1000);
+            return bytes / ((double) elapsedTime / 1000); // 1000 = millisecs/sec
         }
         return 0.0;
     }
@@ -194,10 +194,10 @@
     /**
      * Throughput in kilobytes / second
      * 
-     * @return
+     * @return Throughput in kilobytes / second
      */
     public double getKBPerSecond() {
-        return getBytesPerSecond() / 1024;
+        return getBytesPerSecond() / 1024; // 1024=bytes per kb
     }
 
 }

Modified: jakarta/jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/changes.xml?rev=578467&r1=578466&r2=578467&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/changes.xml (original)
+++ jakarta/jmeter/trunk/xdocs/changes.xml Sat Sep 22 11:14:53 2007
@@ -58,7 +58,7 @@
 <li>Fixup broken jmeter-server script</li>
 <li>Bug 43364 - option to revert If Controller to pre 2.3RC3 behaviour</li>
 <li>Bug 43449 - Statistical Remote mode does not handle Latency</li>
-<li>Bug 43450 (partial fix) - Allow SampleCount to be saved/restored from files</li>
+<li>Bug 43450 (partial fix) - Allow SampleCount and ErrorCount to be saved to/restored from files</li>
 </ul>
 
 <h4>Improvements</h4>



---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org