On 25 August 2013 15:11, <[email protected]> wrote: > Author: pmouawad > Date: Sun Aug 25 14:11:05 2013 > New Revision: 1517293 > > URL: http://svn.apache.org/r1517293 > Log: > Bug 55403 - Enhancement to OS sampler: Support for timeout > Bugzilla Id: 55403 > > Modified: > jmeter/trunk/bin/jmeter.properties > jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties > jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties > > jmeter/trunk/src/core/org/apache/jmeter/testelement/AbstractTestElement.java > jmeter/trunk/src/core/org/apache/jmeter/testelement/TestElement.java > jmeter/trunk/src/jorphan/org/apache/jorphan/exec/SystemCommand.java > > jmeter/trunk/src/protocol/native/org/apache/jmeter/protocol/system/NativeCommand.java > > jmeter/trunk/src/protocol/native/org/apache/jmeter/protocol/system/SystemSampler.java > > jmeter/trunk/src/protocol/native/org/apache/jmeter/protocol/system/gui/SystemSamplerGui.java > jmeter/trunk/xdocs/changes.xml > > Modified: jmeter/trunk/bin/jmeter.properties > URL: > http://svn.apache.org/viewvc/jmeter/trunk/bin/jmeter.properties?rev=1517293&r1=1517292&r2=1517293&view=diff > ============================================================================== > --- jmeter/trunk/bin/jmeter.properties (original) > +++ jmeter/trunk/bin/jmeter.properties Sun Aug 25 14:11:05 2013 > @@ -626,6 +626,12 @@ wmlParser.types=text/vnd.wap.wml > # monitor.buffer.size=800 > > #--------------------------------------------------------------------------- > +# OS Process Sampler configuration > +#--------------------------------------------------------------------------- > +# Polling to see if process has finished its work, used when a timeout is > configured on sampler > +#os_sampler.poll_for_timeout=100 > + > +#--------------------------------------------------------------------------- > # TCP Sampler configuration > #--------------------------------------------------------------------------- > > > Modified: > jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties > URL: > http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties?rev=1517293&r1=1517292&r2=1517293&view=diff > ============================================================================== > --- jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties > (original) > +++ jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties Sun > Aug 25 14:11:05 2013 > @@ -1090,6 +1090,8 @@ throughput_control_title=Throughput Cont > throughput_control_tplabel=Throughput > time_format=Format string for SimpleDateFormat (optional) > timelim=Time limit > +timeout_config_box_title=Timeout configuration > +timeout_title=Timeout (ms) > toggle=Toggle > toolbar_icon_set_not_found=The file description of toolbar icon set is not > found. See logs. > total_threads_tooltip=Total number of threads to run > > Modified: > jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties > URL: > http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties?rev=1517293&r1=1517292&r2=1517293&view=diff > ============================================================================== > --- jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties > (original) > +++ jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties > Sun Aug 25 14:11:05 2013 > @@ -1083,6 +1083,8 @@ throughput_control_title=Contr\u00F4leur > throughput_control_tplabel=D\u00E9bit \: > time_format=Chaine de formatage sur le mod\u00E8le SimpleDateFormat > (optionnel) > timelim=Limiter le temps de r\u00E9ponses \u00E0 (ms) > +timeout_config_box_title=Configuration du d\u00E9lai d'expiration > +timeout_title=D\u00E9lai expiration (ms) > toggle=Permuter > toolbar_icon_set_not_found=Le fichier de description des ic\u00F4nes de la > barre d'outils n'est pas trouv\u00E9. Voir les journaux. > total_threads_tooltip=Nombre total d'Unit\u00E9s \u00E0 lancer > > Modified: > jmeter/trunk/src/core/org/apache/jmeter/testelement/AbstractTestElement.java > URL: > http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/testelement/AbstractTestElement.java?rev=1517293&r1=1517292&r2=1517293&view=diff > ============================================================================== > --- > jmeter/trunk/src/core/org/apache/jmeter/testelement/AbstractTestElement.java > (original) > +++ > jmeter/trunk/src/core/org/apache/jmeter/testelement/AbstractTestElement.java > Sun Aug 25 14:11:05 2013 > @@ -33,6 +33,7 @@ import org.apache.jmeter.testelement.pro > import org.apache.jmeter.testelement.property.CollectionProperty; > import org.apache.jmeter.testelement.property.IntegerProperty; > import org.apache.jmeter.testelement.property.JMeterProperty; > +import org.apache.jmeter.testelement.property.LongProperty; > import org.apache.jmeter.testelement.property.MapProperty; > import org.apache.jmeter.testelement.property.MultiProperty; > import org.apache.jmeter.testelement.property.NullProperty; > @@ -406,7 +407,7 @@ public abstract class AbstractTestElemen > } > > /** > - * Create a boolean property - but only if it is not the default. > + * Create an int property - but only if it is not the default. > * This is intended for use when adding new properties to JMeter > * so that JMX files are not expanded unnecessarily. > * > @@ -424,6 +425,31 @@ public abstract class AbstractTestElemen > setProperty(new IntegerProperty(name, value)); > } > } > + > + @Override > + public void setProperty(String name, long value) { > + setProperty(new LongProperty(name, value)); > + } > + > + /** > + * Create a long property - but only if it is not the default. > + * This is intended for use when adding new properties to JMeter > + * so that JMX files are not expanded unnecessarily. > + * > + * N.B. - must agree with the default applied when reading the property. > + * > + * @param name property name > + * @param value current value > + * @param dflt default > + */ > + @Override > + public void setProperty(String name, long value, long dflt) { > + if (value == dflt) { > + removeProperty(name); > + } else { > + setProperty(new LongProperty(name, value)); > + } > + } > > @Override > public PropertyIterator propertyIterator() { > > Modified: jmeter/trunk/src/core/org/apache/jmeter/testelement/TestElement.java > URL: > http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/testelement/TestElement.java?rev=1517293&r1=1517292&r2=1517293&view=diff > ============================================================================== > --- jmeter/trunk/src/core/org/apache/jmeter/testelement/TestElement.java > (original) > +++ jmeter/trunk/src/core/org/apache/jmeter/testelement/TestElement.java Sun > Aug 25 14:11:05 2013 > @@ -56,6 +56,10 @@ public interface TestElement extends Clo > > void setProperty(String key, int value, int dflt); > > + void setProperty(String name, long value); > + > + void setProperty(String name, long value, long dflt); > + > /** > * Check if ENABLED property is present and true ; defaults to true > *
Ideally it would have been better to add the changes to TestElement/ATE in a separate commit, as they are generic. > Modified: jmeter/trunk/src/jorphan/org/apache/jorphan/exec/SystemCommand.java > URL: > http://svn.apache.org/viewvc/jmeter/trunk/src/jorphan/org/apache/jorphan/exec/SystemCommand.java?rev=1517293&r1=1517292&r2=1517293&view=diff > ============================================================================== > --- jmeter/trunk/src/jorphan/org/apache/jorphan/exec/SystemCommand.java > (original) > +++ jmeter/trunk/src/jorphan/org/apache/jorphan/exec/SystemCommand.java Sun > Aug 25 14:11:05 2013 > @@ -26,6 +26,7 @@ import java.util.Collections; > import java.util.List; > import java.util.Map; > > +import org.apache.jmeter.util.JMeterUtils; > import org.apache.jorphan.util.JOrphanUtils; > > /** > @@ -33,6 +34,7 @@ import org.apache.jorphan.util.JOrphanUt > */ > public class SystemCommand { > > + private static final int POLL_INTERVAL = > JMeterUtils.getPropDefault("os_sampler.poll_for_timeout", 100); > private StreamGobbler outputGobbler; > private final File directory; > private final Map<String, String> env; > @@ -40,25 +42,28 @@ public class SystemCommand { > private final String stdin; > private final String stdout; > private final String stderr; > + private final long timeoutMillis; > > /** > * @param env Environment variables appended to environment (may be null) > * @param directory File working directory (may be null) > */ > public SystemCommand(File directory, Map<String, String> env) { > - this(directory, env, null, null, null); > + this(directory, 0L, env, null, null, null); > } > > /** > * > * @param env Environment variables appended to environment (may be null) > * @param directory File working directory (may be null) > + * @param timeoutMillis timeout in Milliseconds > * @param stdin File name that will contain data to be input to process > (may be null) > * @param stdout File name that will contain out stream (may be null) > * @param stderr File name that will contain err stream (may be null) > */ > - public SystemCommand(File directory, Map<String, String> env, String > stdin, String stdout, String stderr) { > + public SystemCommand(File directory, long timeoutMillis, Map<String, > String> env, String stdin, String stdout, String stderr) { > super(); > + this.timeoutMillis = timeoutMillis; > this.directory = directory; > this.env = env; > this.stdin = JOrphanUtils.nullifyIfEmptyTrimmed(stdin); > @@ -108,7 +113,7 @@ public class SystemCommand { > } else { > proc.getOutputStream().close(); // ensure the application > does not hang if it requests input > } > - int exitVal = proc.waitFor(); > + int exitVal = waitForEndWithTimeout(proc, timeoutMillis); > > if (outputGobbler != null) { > outputGobbler.join(); > @@ -139,6 +144,44 @@ public class SystemCommand { > } > > /** > + * Wait for end of proc execution or timeout if timeoutInMillis is > greater than 0 > + * @param proc Process > + * @param timeoutInMillis long timeout in ms > + * @return proc exit value > + * @throws InterruptedException > + */ > + private int waitForEndWithTimeout(Process proc, long timeoutInMillis) > throws InterruptedException { > + if (timeoutInMillis <= 0L) { > + return proc.waitFor(); > + } else { > + long now = System.currentTimeMillis(); > + long finish = now + timeoutInMillis; > + while (isAlive(proc) && (System.currentTimeMillis() < finish)) { > + Thread.sleep(POLL_INTERVAL); > + } > + > + if (isAlive(proc)) { This will leave the process running. Is that intentional? If so, it needs to be documented. > + throw new InterruptedException( "Process timeout out after " > + timeoutInMillis + " milliseconds" ); > + } > + return proc.exitValue(); > + } > + } > + > + /** > + * > + * @param p Process > + * @return true if p is still running > + */ > + public static boolean isAlive(Process p) { > + try { > + p.exitValue(); > + return false; > + } catch (IllegalThreadStateException e) { > + return true; > + } > + } > + > + /** > * @return Out/Err stream contents > */ > public String getOutResult() { > > Modified: > jmeter/trunk/src/protocol/native/org/apache/jmeter/protocol/system/NativeCommand.java > URL: > http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/native/org/apache/jmeter/protocol/system/NativeCommand.java?rev=1517293&r1=1517292&r2=1517293&view=diff > ============================================================================== > --- > jmeter/trunk/src/protocol/native/org/apache/jmeter/protocol/system/NativeCommand.java > (original) > +++ > jmeter/trunk/src/protocol/native/org/apache/jmeter/protocol/system/NativeCommand.java > Sun Aug 25 14:11:05 2013 > @@ -45,7 +45,7 @@ public class NativeCommand extends org. > * @param stderr File name that will contain err stream > */ > public NativeCommand(File directory, Map<String, String> env, String > stdin, String stdout, String stderr) { > - super(directory, env, stdin, stdout, stderr); > + super(directory, 0L, env, stdin, stdout, stderr); > } > > } > \ No newline at end of file > > Modified: > jmeter/trunk/src/protocol/native/org/apache/jmeter/protocol/system/SystemSampler.java > URL: > http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/native/org/apache/jmeter/protocol/system/SystemSampler.java?rev=1517293&r1=1517292&r2=1517293&view=diff > ============================================================================== > --- > jmeter/trunk/src/protocol/native/org/apache/jmeter/protocol/system/SystemSampler.java > (original) > +++ > jmeter/trunk/src/protocol/native/org/apache/jmeter/protocol/system/SystemSampler.java > Sun Aug 25 14:11:05 2013 > @@ -67,6 +67,8 @@ public class SystemSampler extends Abstr > > private static final String STDIN = "SystemSampler.stdin"; > > + private static final String TIMEOUT = "SystemSampler.timeout"; > + > // - JMX names > > /** > @@ -144,7 +146,7 @@ public class SystemSampler extends Abstr > "\nEnvironment:"+env+ > "\nExecuting:" + cmdLine.toString()); > > - SystemCommand nativeCommand = new SystemCommand(directory, env, > getStdin(), getStdout(), getStderr()); > + SystemCommand nativeCommand = new SystemCommand(directory, > getTimeout(), env, getStdin(), getStdout(), getStderr()); > > try { > results.sampleStart(); > @@ -309,4 +311,11 @@ public class SystemSampler extends Abstr > setProperty(STDIN, filename, ""); > } > > + public long getTimeout() { > + return getPropertyAsLong(TIMEOUT, 0L); > + } > + > + public void setTimout(long timeoutMs) { > + setProperty(TIMEOUT, timeoutMs, 0L); > + } > } > \ No newline at end of file > > Modified: > jmeter/trunk/src/protocol/native/org/apache/jmeter/protocol/system/gui/SystemSamplerGui.java > URL: > http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/native/org/apache/jmeter/protocol/system/gui/SystemSamplerGui.java?rev=1517293&r1=1517292&r2=1517293&view=diff > ============================================================================== > --- > jmeter/trunk/src/protocol/native/org/apache/jmeter/protocol/system/gui/SystemSamplerGui.java > (original) > +++ > jmeter/trunk/src/protocol/native/org/apache/jmeter/protocol/system/gui/SystemSamplerGui.java > Sun Aug 25 14:11:05 2013 > @@ -40,12 +40,15 @@ import org.apache.jmeter.testelement.Tes > import org.apache.jmeter.util.JMeterUtils; > import org.apache.jorphan.gui.JLabeledTextField; > import org.apache.jorphan.gui.ObjectTableModel; > +import org.apache.jorphan.logging.LoggingManager; > import org.apache.jorphan.reflect.Functor; > +import org.apache.log.Logger; > > /** > * GUI for {@link SystemSampler} > */ > public class SystemSamplerGui extends AbstractSamplerGui implements > ItemListener { > + private static final Logger log = LoggingManager.getLoggerForClass(); > > /** > * > @@ -59,6 +62,7 @@ public class SystemSamplerGui extends Ab > private final FilePanelEntry stderr = new > FilePanelEntry(JMeterUtils.getResString("system_sampler_stderr")); // > $NON-NLS-1$ > private JLabeledTextField directory; > private JLabeledTextField command; > + private JLabeledTextField timeout; > private ArgumentsPanel argsPanel; > private ArgumentsPanel envPanel; > > @@ -92,7 +96,8 @@ public class SystemSamplerGui extends Ab > > JPanel streamsCodePane = new JPanel(new BorderLayout()); > streamsCodePane.add(makeStreamsPanel(), BorderLayout.NORTH); > - streamsCodePane.add(makeReturnCodePanel(), BorderLayout.SOUTH); > + streamsCodePane.add(makeReturnCodePanel(), BorderLayout.CENTER); > + streamsCodePane.add(makeTimeoutPanel(), BorderLayout.SOUTH); > add(streamsCodePane, BorderLayout.SOUTH); > } > > @@ -125,6 +130,13 @@ public class SystemSamplerGui extends Ab > systemSampler.setStdin(stdin.getFilename()); > systemSampler.setStdout(stdout.getFilename()); > systemSampler.setStderr(stderr.getFilename()); > + if(!StringUtils.isEmpty(timeout.getText())) { > + try { > + systemSampler.setTimout(Long.parseLong(timeout.getText())); > + } catch (NumberFormatException e) { > + log.error("Error parsing timeout field > value:"+timeout.getText(), e); > + } > + } > } > > /* Overrides AbstractJMeterGuiComponent.configure(TestElement) */ > @@ -165,6 +177,21 @@ public class SystemSamplerGui extends Ab > } > > /** > + * @return JPanel timeout config > + */ > + private JPanel makeTimeoutPanel() { > + JPanel panel = new JPanel(); > + panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); > + panel.setBorder(BorderFactory.createTitledBorder( > + BorderFactory.createEtchedBorder(), > + JMeterUtils.getResString("timeout_config_box_title"))); // > $NON-NLS-1$ > + timeout = new > JLabeledTextField(JMeterUtils.getResString("timeout_title")); // $NON-NLS-1$ > + timeout.setSize(timeout.getSize().height, 30); > + panel.add(timeout); > + return panel; > + } > + > + /** > * @return JPanel Command + directory > */ > private JPanel makeCommandPanel() { > > Modified: jmeter/trunk/xdocs/changes.xml > URL: > http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1517293&r1=1517292&r2=1517293&view=diff > ============================================================================== > --- jmeter/trunk/xdocs/changes.xml (original) > +++ jmeter/trunk/xdocs/changes.xml Sun Aug 25 14:11:05 2013 > @@ -73,6 +73,11 @@ citizen in JMeter, you can now test your > <figure width="906" height="313" > image="changes/2.10/03_mongodb_script_alpha.png"></figure> > </p> > > +<h4>* Timeout has been added to OS Process Sampler</h4> > +<p> > +<figure width="540" height="600" > image="changes/2.10/17_os_process_timeout.png"></figure> > +</p> > + > <h4>* Query timeout has been added to JDBC Request</h4> > <p> > <figure width="540" height="600" > image="changes/2.10/04_jdbc_request_timeout.png"></figure> > @@ -129,19 +134,22 @@ template into your Test Plan</h4> > <figure width="911" height="614" > image="changes/2.10/11_color_syntax_jsr223_preprocessor.png"></figure> > </p> > > +<h4>* JMeter GUI can now be fully Internationalized, all remaining issues > have been fixed</h4> > +<h5>Currently French has all its labels translated. Other languages are > partly translated, feel free to > +contribute translations by reading <a > href="localising/index.html">Localisation (Translator's Guide)</a></h5> > + > <h4>* Moving elements in Test plan has been improved in many ways</h4> > <h5>Drag and drop of elements in Test Plan tree is now much easier and > possible on multiple nodes</h5> > <p> > <figure width="894" height="236" > image="changes/2.10/12_drap_n-drop_multiple.png"></figure> > </p> > <p> > -Note that due to this <a > href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6560955">bug in > Java</a>, > +<b>Note that due to this <a > href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6560955">bug in > Java</a>, > you cannot drop a node after last node. The workaround is to drop it before > this last node and then Drag and Drop the last node > -before the one you just dropped. > -<figure width="762" height="277" image="changes/2.10/XXX.png"></figure> > +before the one you just dropped.</b> > </p> > <h5>New shortcuts have been added to move elements in the tree. </h5> > -<p>(alt + Arrow Up) and (alt + Arrow Down) move the element within the > parent node. > +<p>(alt + Arrow Up) and (alt + Arrow Down) move the element within the > parent node.<br/> > (alt + Arrow Left) and (alt + Arrow Right) move the element up and down in > the tree depth</p> > > <h4>* Response Time Graph Y axis can now be scaled</h4> > @@ -328,6 +336,7 @@ Previously the default was 1, which coul > <li><bugzilla>54759</bugzilla> - SSLPeerUnverifiedException using HTTPS , > property documented.</li> > <li><bugzilla>54896</bugzilla> - JUnit sampler gives only "failed to create > an instance of the class" message with constructor problems.</li> > <li><bugzilla>55084</bugzilla> - Add timeout support for JDBC Request. > Contributed by Mikhail Epikhin (epihin-m at yandex.ru)</li> > +<li><bugzilla>55403</bugzilla> - Enhancement to OS sampler: Support for > timeout</li> > </ul> > > <h3>Controllers</h3> > >
