Author: sebb
Date: Sat Nov 8 06:19:48 2008
New Revision: 712398
URL: http://svn.apache.org/viewvc?rev=712398&view=rev
Log:
More efficient loading of JTL files
Don't clear Visualizer before loading the file
Added:
jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollectorHelper.java
(with props)
Modified:
jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollector.java
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/CSVSaveService.java
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/OldSaveService.java
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/converters/TestResultWrapperConverter.java
jakarta/jmeter/trunk/xdocs/changes.xml
jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml
jakarta/jmeter/trunk/xdocs/usermanual/listeners.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=712398&r1=712397&r2=712398&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
Sat Nov 8 06:19:48 2008
@@ -31,7 +31,6 @@
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.io.Serializable;
-import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@@ -49,7 +48,6 @@
import org.apache.jmeter.save.CSVSaveService;
import org.apache.jmeter.save.OldSaveService;
import org.apache.jmeter.save.SaveService;
-import org.apache.jmeter.save.TestResultWrapper;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.testelement.TestListener;
import org.apache.jmeter.testelement.property.BooleanProperty;
@@ -208,7 +206,7 @@
* @param successOnly if success only wanted
* @return whether to log/display the sample
*/
- public boolean isSampleWanted(boolean success, boolean errorOnly,
+ public static boolean isSampleWanted(boolean success, boolean errorOnly,
boolean successOnly) {
return (!errorOnly && !successOnly) ||
(success && successOnly) ||
@@ -274,7 +272,6 @@
String filename = getFilename();
File file = new File(filename);
if (file.exists()) {
- clearVisualizer();
BufferedReader dataReader = null;
BufferedInputStream bufferedInputStream = null;
try {
@@ -292,8 +289,8 @@
} else { // We are processing XML
try { // Assume XStream
bufferedInputStream = new BufferedInputStream(new
FileInputStream(file));
- // TODO change to process samples one by one
-
readSamples(SaveService.loadTestResults(bufferedInputStream), visualizer);
+ SaveService.loadTestResults(bufferedInputStream,
+ new ResultCollectorHelper(this,
visualizer));
parsedOK = true;
} catch (Exception e) {
log.info("Failed to load "+filename+" using
XStream, trying old XML format. Error was: "+e);
@@ -312,6 +309,8 @@
log.warn("Problem reading JTL file: "+file);
} catch (RuntimeException e){ // e.g. NullPointerException
log.warn("Problem reading JTL file: "+file,e);
+ } catch (OutOfMemoryError e) {
+ log.warn("Problem reading JTL file: "+file,e);
} finally {
JOrphanUtils.closeQuietly(dataReader);
JOrphanUtils.closeQuietly(bufferedInputStream);
@@ -440,28 +439,6 @@
return true;
}
- // Only called if visualizer is non-null
- private void readSamples(TestResultWrapper testResults, Visualizer
visualizer) throws Exception {
- Collection samples = testResults.getSampleResults();
- final boolean errorsOnly = isErrorLogging();
- final boolean successOnly = isSuccessOnlyLogging();
- Iterator iter = samples.iterator();
- while (iter.hasNext()) {
- SampleResult result = (SampleResult) iter.next();
- if (isSampleWanted(result.isSuccessful(), errorsOnly,
successOnly)) {
- visualizer.add(result);
- }
- }
- }
-
- public void clearVisualizer() {
- // current = -1;
- if (getVisualizer() != null && getVisualizer() instanceof Clearable) {
- ((Clearable) getVisualizer()).clearData();
- }
- finalizeFileOutput();
- }
-
public void sampleStarted(SampleEvent e) {
}
Added:
jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollectorHelper.java
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollectorHelper.java?rev=712398&view=auto
==============================================================================
---
jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollectorHelper.java
(added)
+++
jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollectorHelper.java
Sat Nov 8 06:19:48 2008
@@ -0,0 +1,46 @@
+/*
+ * 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.reporters;
+
+import org.apache.jmeter.reporters.ResultCollector;
+import org.apache.jmeter.samplers.SampleResult;
+import org.apache.jmeter.visualizers.Visualizer;
+
+/**
+ * Helper class to allow TestResultWrapperConverter to send samples
+ * directly to the visualiser if required.
+ */
+public class ResultCollectorHelper {
+
+ private final Visualizer visualizer;
+ private final boolean errorsOnly;
+ private final boolean successOnly;
+
+ public ResultCollectorHelper(ResultCollector resultCollector, Visualizer
visualizer) {
+ this.visualizer = visualizer;
+ this.errorsOnly = resultCollector.isErrorLogging();
+ this.successOnly = resultCollector.isSuccessOnlyLogging();
+ }
+
+ public void add(SampleResult sample){
+ if (ResultCollector.isSampleWanted(sample.isSuccessful(), errorsOnly,
successOnly)){
+ visualizer.add(sample);
+ }
+ }
+}
Propchange:
jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollectorHelper.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
jakarta/jmeter/trunk/src/core/org/apache/jmeter/reporters/ResultCollectorHelper.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Modified:
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/CSVSaveService.java
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/CSVSaveService.java?rev=712398&r1=712397&r2=712398&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/CSVSaveService.java
(original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/CSVSaveService.java
Sat Nov 8 06:19:48 2008
@@ -142,7 +142,7 @@
SampleEvent event =
CSVSaveService.makeResultFromDelimitedString(parts,saveConfig,lineNumber);
if (event != null){
final SampleResult result = event.getResult();
- if
(resultCollector.isSampleWanted(result.isSuccessful(),errorsOnly, successOnly))
{
+ if
(ResultCollector.isSampleWanted(result.isSuccessful(),errorsOnly, successOnly))
{
visualizer.add(result);
}
}
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=712398&r1=712397&r2=712398&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 Nov 8 06:19:48 2008
@@ -492,7 +492,7 @@
final boolean successOnly = rc.isSuccessOnlyLogging();
for (int i = 0; i < samples.length; i++) {
SampleResult result = OldSaveService.getSampleResult(samples[i]);
- if (rc.isSampleWanted(result.isSuccessful(), errorsOnly,
successOnly)) {
+ if (ResultCollector.isSampleWanted(result.isSuccessful(),
errorsOnly, successOnly)) {
visualizer.add(result);
}
}
Modified: jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java?rev=712398&r1=712397&r2=712398&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java
(original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java Sat
Nov 8 06:19:48 2008
@@ -33,6 +33,7 @@
import java.nio.charset.Charset;
+import org.apache.jmeter.reporters.ResultCollectorHelper;
import org.apache.jmeter.samplers.SampleEvent;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.util.JMeterUtils;
@@ -51,6 +52,7 @@
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.DataHolder;
import
com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider;
+import com.thoughtworks.xstream.converters.reflection.ReflectionProvider;
/**
* Handles setting up XStream serialisation.
@@ -61,9 +63,15 @@
private static final Logger log = LoggingManager.getLoggerForClass();
+ // Names of DataHolder entries
public static final String SAMPLE_EVENT_OBJECT = "SampleEvent"; //
$NON-NLS-1$
+ public static final String RESULTCOLLECTOR_HELPER_OBJECT =
"ResultCollectorHelper"; // $NON-NLS-1$
+
+ private static final class XStreamWrapper extends XStream {
+ private XStreamWrapper(ReflectionProvider reflectionProvider) {
+ super(reflectionProvider);
+ }
- private static final XStream saver = new XStream(new
PureJavaReflectionProvider()){
// Override wrapMapper in order to insert the Wrapper in the chain
protected MapperWrapper wrapMapper(MapperWrapper next) {
// Provide our own aliasing using strings rather than classes
@@ -83,8 +91,14 @@
}
};
}
- };
+ }
+ private static final XStream JMXSAVER = new XStreamWrapper(new
PureJavaReflectionProvider());
+ private static final XStream JTLSAVER = new XStreamWrapper(new
PureJavaReflectionProvider());
+ static {
+ JTLSAVER.setMode(XStream.NO_REFERENCES); // This is needed to stop
XStream keeping copies of each class
+ }
+
// The XML header, with placeholder for encoding, since that is controlled
by property
private static final String XML_HEADER = "<?xml version=\"1.0\"
encoding=\"<ph>\"?>"; // $NON-NLS-1$
@@ -195,16 +209,14 @@
} else {
key = key.substring(1);// Remove the leading "_"
try {
- if (val.trim().equals("collection")) { //
$NON-NLS-1$
- saver.registerConverter((Converter)
Class.forName(key).getConstructor(
- new Class[] { Mapper.class
}).newInstance(
- new Object[] { saver.getMapper() }));
- } else if (val.trim().equals("mapping")) { //
$NON-NLS-1$
- saver.registerConverter((Converter)
Class.forName(key).getConstructor(
- new Class[] { Mapper.class
}).newInstance(
- new Object[] { saver.getMapper() }));
+ final String trimmedValue = val.trim();
+ if (trimmedValue.equals("collection") //
$NON-NLS-1$
+ || trimmedValue.equals("mapping")) { //
$NON-NLS-1$
+ registerConverter(key, JMXSAVER, true);
+ registerConverter(key, JTLSAVER, true);
} else {
- saver.registerConverter((Converter)
Class.forName(key).newInstance());
+ registerConverter(key, JMXSAVER, false);
+ registerConverter(key, JTLSAVER, false);
}
} catch (IllegalAccessException e1) {
log.warn("Can't register a converter: " + key, e1);
@@ -230,6 +242,31 @@
}
}
+ /**
+ * Register converter.
+ * @param key
+ * @param jmxsaver
+ * @param useMapper
+ *
+ * @throws InstantiationException
+ * @throws IllegalAccessException
+ * @throws InvocationTargetException
+ * @throws NoSuchMethodException
+ * @throws ClassNotFoundException
+ */
+ private static void registerConverter(String key, XStream jmxsaver,
boolean useMapper)
+ throws InstantiationException, IllegalAccessException,
+ InvocationTargetException, NoSuchMethodException,
+ ClassNotFoundException {
+ if (useMapper){
+ jmxsaver.registerConverter((Converter)
Class.forName(key).getConstructor(
+ new Class[] { Mapper.class }).newInstance(
+ new Object[] { jmxsaver.getMapper() }));
+ } else {
+ jmxsaver.registerConverter((Converter)
Class.forName(key).newInstance());
+ }
+ }
+
// For converters to use
public static String aliasToClass(String s){
String r = aliasToClass.getProperty(s);
@@ -250,7 +287,7 @@
// Use deprecated method, to avoid duplicating code
ScriptWrapper wrapper = new ScriptWrapper();
wrapper.testPlan = tree;
- saver.toXML(wrapper, outputStreamWriter);
+ JMXSAVER.toXML(wrapper, outputStreamWriter);
outputStreamWriter.write('\n');// Ensure terminated properly
outputStreamWriter.close();
}
@@ -261,7 +298,7 @@
OutputStreamWriter outputStreamWriter = getOutputStreamWriter(out);
writeXmlHeader(outputStreamWriter);
// Use deprecated method, to avoid duplicating code
- saver.toXML(el, outputStreamWriter);
+ JMXSAVER.toXML(el, outputStreamWriter);
outputStreamWriter.close();
}
@@ -270,7 +307,7 @@
// Get the InputReader to use
InputStreamReader inputStreamReader = getInputStreamReader(in);
// Use deprecated method, to avoid duplicating code
- Object element = saver.fromXML(inputStreamReader);
+ Object element = JMXSAVER.fromXML(inputStreamReader);
inputStreamReader.close();
return element;
}
@@ -283,11 +320,11 @@
*/
// Used by ResultCollector#recordResult()
public synchronized static void saveSampleResult(SampleEvent evt, Writer
writer) throws IOException {
- DataHolder dh = saver.newDataHolder();
+ DataHolder dh = JTLSAVER.newDataHolder();
dh.put(SAMPLE_EVENT_OBJECT, evt);
// This is effectively the same as saver.toXML(Object, Writer) except
we get to provide the DataHolder
// Don't know why there is no method for this in the XStream class
- saver.marshal(evt.getResult(), new XppDriver().createWriter(writer),
dh);
+ JTLSAVER.marshal(evt.getResult(), new
XppDriver().createWriter(writer), dh);
writer.write('\n');
}
@@ -297,7 +334,7 @@
*/
// Used by ResultCollector#recordStats()
public synchronized static void saveTestElement(TestElement elem, Writer
writer) throws IOException {
- saver.toXML(elem, writer);
+ JMXSAVER.toXML(elem, writer); // TODO should this be JTLSAVER? Only
seems to be called by MonitorHealthVisualzer
writer.write('\n');
}
@@ -377,14 +414,30 @@
return versionsOK;
}
- public static TestResultWrapper loadTestResults(InputStream reader) throws
Exception {
+ /**
+ * Read results from JTL file.
+ *
+ * @param reader of the file
+ * @param resultCollectorHelper helper class to enable
TestResultWrapperConverter to deliver the samples
+ * @throws Exception
+ */
+ public static void loadTestResults(InputStream reader,
ResultCollectorHelper resultCollectorHelper) throws Exception {
// Get the InputReader to use
InputStreamReader inputStreamReader = getInputStreamReader(reader);
- TestResultWrapper wrapper = (TestResultWrapper)
saver.fromXML(inputStreamReader);
+ DataHolder dh = JTLSAVER.newDataHolder();
+ dh.put(RESULTCOLLECTOR_HELPER_OBJECT, resultCollectorHelper); // Allow
TestResultWrapper to feed back the samples
+ // This is effectively the same as saver.fromXML(InputStream) except
we get to provide the DataHolder
+ // Don't know why there is no method for this in the XStream class
+ JTLSAVER.unmarshal(new XppDriver().createReader(reader), null, dh);
inputStreamReader.close();
- return wrapper;
}
+ /**
+ * Load a Test tree (JMX file)
+ * @param reader on the JMX file
+ * @return the loaded tree
+ * @throws Exception if there is a problem reading the file or processing
it
+ */
public static HashTree loadTree(InputStream reader) throws Exception {
if (!reader.markSupported()) {
reader = new BufferedInputStream(reader);
@@ -394,7 +447,7 @@
try {
// Get the InputReader to use
InputStreamReader inputStreamReader = getInputStreamReader(reader);
- wrapper = (ScriptWrapper) saver.fromXML(inputStreamReader);
+ wrapper = (ScriptWrapper) JMXSAVER.fromXML(inputStreamReader);
inputStreamReader.close();
if (wrapper == null){
log.error("Problem loading new style: see above.");
Modified:
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/converters/TestResultWrapperConverter.java
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/converters/TestResultWrapperConverter.java?rev=712398&r1=712397&r2=712398&view=diff
==============================================================================
---
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/converters/TestResultWrapperConverter.java
(original)
+++
jakarta/jmeter/trunk/src/core/org/apache/jmeter/save/converters/TestResultWrapperConverter.java
Sat Nov 8 06:19:48 2008
@@ -24,15 +24,17 @@
import java.util.ArrayList;
import java.util.Collection;
+import org.apache.jmeter.reporters.ResultCollectorHelper;
import org.apache.jmeter.samplers.SampleResult;
+import org.apache.jmeter.save.SaveService;
import org.apache.jmeter.save.TestResultWrapper;
-import com.thoughtworks.xstream.mapper.Mapper;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import
com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
+import com.thoughtworks.xstream.mapper.Mapper;
/**
* XStream Class to convert TestResultWrapper
@@ -76,8 +78,12 @@
// ResultCollector class
}
- /*
- * (non-Javadoc)
+ /**
+ * Read test results from JTL files and pass them to the visualiser
directly.
+ * If the ResultCollector helper object is defined, then pass the samples
to that
+ * rather than adding them to the test result wrapper.
+ *
+ * @return the test result wrapper (may be empty)
*
* @see
com.thoughtworks.xstream.converters.Converter#unmarshal(com.thoughtworks.xstream.io.HierarchicalStreamReader,
* com.thoughtworks.xstream.converters.UnmarshallingContext)
@@ -90,12 +96,16 @@
ver = "1.0"; //$NON-NLS-1$
}
results.setVersion(ver);
- ConversionHelp.setInVersion(ver);// Make sure decoding follows input
- // file
+ ConversionHelp.setInVersion(ver);// Make sure decoding follows input
file
+ final ResultCollectorHelper resultCollectorHelper =
(ResultCollectorHelper) context.get(SaveService.RESULTCOLLECTOR_HELPER_OBJECT);
while (reader.hasMoreChildren()) {
reader.moveDown();
- SampleResult res = (SampleResult) readItem(reader, context,
results);
- samples.add(res);
+ SampleResult sample = (SampleResult) readItem(reader, context,
results);
+ if (resultCollectorHelper != null) {
+ resultCollectorHelper.add(sample);
+ } else {
+ samples.add(sample);
+ }
reader.moveUp();
}
results.setSampleResults(samples);
Modified: jakarta/jmeter/trunk/xdocs/changes.xml
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/changes.xml?rev=712398&r1=712397&r2=712398&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/changes.xml (original)
+++ jakarta/jmeter/trunk/xdocs/changes.xml Sat Nov 8 06:19:48 2008
@@ -68,6 +68,12 @@
<h3>Incompatible changes</h3>
<p>
+When loading sample results from a file, previous results are no longer
cleared.
+This allows one to merge multiple files.
+If the previous behaviour is required,
+use the menu item Run/Clear (Ctrl+Shift+E) or Run/Clear All (Ctrl+E) before
loading the file.
+</p>
+<p>
The test elements "Save Results to a file" and "Generate Summary Results" are
now shown as Listeners.
They were previously shown as Post-Processors, even though they are
implemented as Listeners.
</p>
@@ -179,6 +185,8 @@
<li>JDBC Request now handles quoted strings.</li>
<li>JDBC Request now handles arbitray variable types.</li>
<li>Bug 46030 - Extend TCP Sampler to Support Length-Prefixed Binary Data</li>
+<li>Process JVM_ARGS last so users can override default settings</li>
+<li>Read XML JTL files more efficiently - pass samples to visualisers as they
are read, rather than saving them all and then processing them</li>
</ul>
<h3>Non-functional changes</h3>
@@ -188,6 +196,7 @@
<li>Remove unnecessary clone() methods from function classes</li>
<li>Moved PreProcessor invocation to JMeterThread class</li>
<li>Made HashTree Map field final</li>
+<li>Improve performance of calling ResultCollector#isSampleWanted() for
multiple samples</li>
</ul>
</section>
</body>
Modified: jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml?rev=712398&r1=712397&r2=712398&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml (original)
+++ jakarta/jmeter/trunk/xdocs/usermanual/component_reference.xml Sat Nov 8
06:19:48 2008
@@ -1866,8 +1866,15 @@
In order to analyse the data generated by a non-GUI test run, you need to load
the file into the appropriate
Listener.
</p>
-<note>To read existing results and display them, use the file panel Browse
button to open the file.
+<note>
+To read existing results and display them, use the file panel Browse button to
open the file.
</note>
+<p>
+Versions of JMeter up to 2.3.2 <b>used to clear any current data</b> before
loading the new file.<br></br>
+This is no longer done, thus <b>allowing files to be merged</b>.
+If the previous behaviour is required,
+use the menu item Run/Clear (Ctrl+Shift+E) or Run/Clear All (Ctrl+E) before
loading the file.
+</p>
<p>Results can be read from XML or CSV format files.
When reading from CSV results files, the header (if present) is used to
determine which fields are present.
<b>In order to interpret a header-less CSV file correctly, the appropriate
properties must be set in jmeter.properties.</b>
Modified: jakarta/jmeter/trunk/xdocs/usermanual/listeners.xml
URL:
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/usermanual/listeners.xml?rev=712398&r1=712397&r2=712398&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/usermanual/listeners.xml (original)
+++ jakarta/jmeter/trunk/xdocs/usermanual/listeners.xml Sat Nov 8 06:19:48 2008
@@ -459,8 +459,13 @@
When reading from CSV results files, the header (if present) is used to
determine which fields were saved.
<b>In order to interpret a header-less CSV file correctly, the appropriate
JMeter properties must be set.</b>
</p>
+<note>
+Versions of JMeter up to 2.3.2 used to clear any current data before loading
the new file.
+This is no longer done, thus allowing files to be merged.
+If the previous behaviour is required,
+use the menu item Run/Clear (Ctrl+Shift+E) or Run/Clear All (Ctrl+E) before
loading the file.
+</note>
</section>
-</body>
<section name="§-num;.10 Saving Listener GUI data" anchor="screencap">
<p>JMeter is capable of saving any listener as a PNG file. To do so, select the
listener in the left panel. Click edit -> Save As Image. A file dialog will
@@ -475,4 +480,5 @@
<figure image="save_image.png">Figure 1 - Edit -> Save As Image</figure>
</section>
+</body>
</document>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]