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 2008/10/11 01:31:22 UTC

svn commit: r703603 - in /jakarta/jmeter/trunk: src/core/org/apache/jmeter/reporters/ResultCollector.java xdocs/changes.xml

Author: sebb
Date: Fri Oct 10 16:31:22 2008
New Revision: 703603

URL: http://svn.apache.org/viewvc?rev=703603&view=rev
Log:
Bug 45976 - incomplete result file when using remote testing with more than 1 server

Modified:
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollector.java
    jakarta/jmeter/trunk/xdocs/changes.xml

Modified: jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollector.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollector.java?rev=703603&r1=703602&r2=703603&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollector.java (original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollector.java Fri Oct 10 16:31:22 2008
@@ -33,10 +33,8 @@
 import java.io.Serializable;
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
-import java.util.Set;
 
 import org.apache.avalon.framework.configuration.DefaultConfigurationSerializer;
 import org.apache.jmeter.engine.event.LoopIterationEvent;
@@ -62,12 +60,16 @@
 import org.apache.jorphan.util.JOrphanUtils;
 import org.apache.log.Logger;
 
+/**
+ * This class handles all saving of samples.
+ * The class must be thread-safe because it is shared between threads (NoThreadClone).
+ */
 public class ResultCollector extends AbstractListenerElement implements SampleListener, Clearable, Serializable,
         TestListener, Remoteable, NoThreadClone {
 
     private static final Logger log = LoggingManager.getLoggerForClass();
 
-    private static final long serialVersionUID = 231L;
+    private static final long serialVersionUID = 233L;
 
     // This string is used to identify local test runs, so must not be a valid host name
     private static final String TEST_IS_LOCAL = "*local*"; // $NON-NLS-1$
@@ -75,7 +77,8 @@
     private static final String TESTRESULTS_START = "<testResults>"; // $NON-NLS-1$
 
     private static final String TESTRESULTS_START_V1_1_PREVER = "<testResults version=\"";  // $NON-NLS-1$
-        private static final String TESTRESULTS_START_V1_1_POSTVER="\">"; // $NON-NLS-1$
+
+    private static final String TESTRESULTS_START_V1_1_POSTVER="\">"; // $NON-NLS-1$
 
     private static final String TESTRESULTS_END = "</testResults>"; // $NON-NLS-1$
 
@@ -84,38 +87,51 @@
     private static final int MIN_XML_FILE_LEN = XML_HEADER.length() + TESTRESULTS_START.length()
             + TESTRESULTS_END.length();
 
-    public final static String FILENAME = "filename"; // $NON-NLS-1$
+    public static final String FILENAME = "filename"; // $NON-NLS-1$
 
-    private final static String SAVE_CONFIG = "saveConfig"; // $NON-NLS-1$
+    private static final String SAVE_CONFIG = "saveConfig"; // $NON-NLS-1$
 
     private static final String ERROR_LOGGING = "ResultCollector.error_logging"; // $NON-NLS-1$
 
     private static final String SUCCESS_ONLY_LOGGING = "ResultCollector.success_only_logging"; // $NON-NLS-1$
+    
+    // Static variables
 
-    private transient DefaultConfigurationSerializer serializer;
+    private static final Map files = new HashMap();
 
-    private transient volatile PrintWriter out;
+    private static int instanceCount; // Keep track of how many instances are active
 
-    private boolean inTest = false;
+    // Instance variables
+    
+    private transient DefaultConfigurationSerializer serializer;
 
-    private static final Map files = new HashMap();
+    private transient volatile PrintWriter out;
 
-    private final Set hosts = new HashSet();
+    private volatile boolean inTest = false;
 
-    protected boolean isStats = false;
+    private volatile boolean isStats = false;
 
     /**
      * No-arg constructor.
      */
     public ResultCollector() {
-        // current = -1;
-        // serializer = new DefaultConfigurationSerializer();
         setErrorLogging(false);
         setSuccessOnlyLogging(false);
         setProperty(new ObjectProperty(SAVE_CONFIG, new SampleSaveConfiguration()));
+        /*
+         * All instances are created before the test starts.
+         * This is guaranteed so long as all remote test plans are initialised
+         * before they are started.
+         * So we use this to ensure that the static variables are reset.
+         */
+        synchronized(this){
+            files.clear();
+            instanceCount=0;
+        }
     }
 
     // Ensure that the sample save config is not shared between copied nodes
+    // N.B. clone only seems to be used for client-server tests
     public Object clone(){
         ResultCollector clone = (ResultCollector) super.clone();
         clone.setSaveConfig((SampleSaveConfiguration)clone.getSaveConfig().clone());
@@ -181,15 +197,15 @@
     }
 
     public synchronized void testEnded(String host) {
-        hosts.remove(host);
-        if (hosts.size() == 0) {
+        instanceCount--;
+        if (instanceCount <= 0) {
             finalizeFileOutput();
             inTest = false;
         }
     }
 
     public synchronized void testStarted(String host) {
-        hosts.add(host);
+        instanceCount++;
         try {
             initializeFileOutput();
             if (getVisualizer() != null) {

Modified: jakarta/jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/changes.xml?rev=703603&r1=703602&r2=703603&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/changes.xml (original)
+++ jakarta/jmeter/trunk/xdocs/changes.xml Fri Oct 10 16:31:22 2008
@@ -112,6 +112,7 @@
 <li>Bug 45928 - AJP/1.3 Sampler doesn't retrieve his label from messages.properties</li>
 <li>Bug 45904 - Allow 'Not' Response Assertion to succeed with null sample</li>
 <li>HTTP and SOAP sampler character encodings updated to be more consistent</li>
+<li>Bug 45976 - incomplete result file when using remote testing with more than 1 server</li>
 </ul>
 
 <h3>Improvements</h3>



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