jmeter-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From sebb <seb...@gmail.com>
Subject Re: svn commit: r1215361 - in /jmeter/trunk: bin/jmeter.properties src/core/org/apache/jmeter/samplers/SampleResult.java test/src/org/apache/jmeter/samplers/TestSampleResult.java xdocs/changes.xml xdocs/usermanual/listeners.xml
Date Thu, 05 Jan 2012 02:20:52 GMT
On 29 December 2011 23:40, sebb <sebbaz@gmail.com> wrote:
> On 28 December 2011 16:35, Philippe Mouawad <philippe.mouawad@gmail.com> wrote:
>> Hello Sebb,
>> FindBugs reports an issue on this called :
>> IC: Initialization circularity (IC_INIT_CIRCULARITY)
>>
>> A circularity was detected in the static initializers of the two classes
>> referenced by the bug instance.  Many kinds of unexpected behavior may
>> arise from such circularity.
>>
>> I didn't find more explanatiions to solve issue if it's really one
>
> I'll have a look next year - currently busy with celebrations (and net
> connection is patchy at present).

Fixed in r1227444

>> Regards
>> Merry Christmas by the way.
>
> Likewise, and Happy New Year!
>
>> Philippe
>>
>> On Sat, Dec 17, 2011 at 1:16 AM, <sebb@apache.org> wrote:
>>
>>> Author: sebb
>>> Date: Sat Dec 17 00:16:06 2011
>>> New Revision: 1215361
>>>
>>> URL: http://svn.apache.org/viewvc?rev=1215361&view=rev
>>> Log:
>>> Bug 52333 - Reduce overhead in calculating SampleResult#nanoTimeOffset
>>> Use a background thread to calculate the offset instead of doing it each
>>> sample
>>>
>>> Modified:
>>>    jmeter/trunk/bin/jmeter.properties
>>>    jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java
>>>    jmeter/trunk/test/src/org/apache/jmeter/samplers/TestSampleResult.java
>>>    jmeter/trunk/xdocs/changes.xml
>>>    jmeter/trunk/xdocs/usermanual/listeners.xml
>>>
>>> Modified: jmeter/trunk/bin/jmeter.properties
>>> URL:
>>> http://svn.apache.org/viewvc/jmeter/trunk/bin/jmeter.properties?rev=1215361&r1=1215360&r2=1215361&view=diff
>>>
>>> ==============================================================================
>>> --- jmeter/trunk/bin/jmeter.properties (original)
>>> +++ jmeter/trunk/bin/jmeter.properties Sat Dec 17 00:16:06 2011
>>> @@ -439,6 +439,10 @@ sampleresult.timestamp.start=true
>>>  # Whether to use System.nanoTime() - otherwise only use
>>> System.currentTimeMillis()
>>>  #sampleresult.useNanoTime=true
>>>
>>> +# Use a background thread to calculate the nanoTime offset
>>> +# Set this to <= 0 to disable the background thread
>>> +#sampleresult.nanoThreadSleep=5000
>>> +
>>>
>>>  #---------------------------------------------------------------------------
>>>  # Upgrade property
>>>
>>>  #---------------------------------------------------------------------------
>>>
>>> Modified:
>>> jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java
>>> URL:
>>> http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java?rev=1215361&r1=1215360&r2=1215361&view=diff
>>>
>>> ==============================================================================
>>> --- jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java
>>> (original)
>>> +++ jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java Sat
>>> Dec 17 00:16:06 2011
>>> @@ -210,6 +210,10 @@ public class SampleResult implements Ser
>>>     static final boolean USENANOTIME
>>>     = JMeterUtils.getPropDefault("sampleresult.useNanoTime", true);  //
>>> $NON-NLS-1$
>>>
>>> +    // How long between checks of nanotime; default 5000ms; set to <=0
to
>>> disable the thread
>>> +    private static final long NANOTHREAD_SLEEP =
>>> +            JMeterUtils.getPropDefault("sampleresult.nanoThreadSleep",
>>> 5000);  // $NON-NLS-1$;
>>> +
>>>     static {
>>>         if (startTimeStamp) {
>>>             log.info("Note: Sample TimeStamps are START times");
>>> @@ -218,32 +222,47 @@ public class SampleResult implements Ser
>>>         }
>>>         log.info("sampleresult.default.encoding is set to " +
>>> DEFAULT_ENCODING);
>>>         log.info("sampleresult.useNanoTime="+USENANOTIME);
>>> +        log.info("sampleresult.nanoThreadSleep="+NANOTHREAD_SLEEP);
>>> +
>>> +        if (USENANOTIME && NANOTHREAD_SLEEP > 0) {
>>> +            NanoOffset nanoOffset = new NanoOffset();
>>> +            nanoOffset.setDaemon(true);
>>> +            nanoOffset.setName("NanoOffset");
>>> +            nanoOffset.start();
>>> +        }
>>>     }
>>>
>>> -    // Allow read access by test code
>>> -    transient final long nanoTimeOffset;
>>>
>>> -    transient final boolean useNanoTime; // Allow test code to change the
>>> default
>>> +    private transient final long nanoTimeOffset;
>>> +
>>> +    // Allow testcode access to the settings
>>> +    transient final boolean useNanoTime;
>>> +
>>> +    transient final long nanoThreadSleep;
>>>
>>>     private long initOffset(){
>>>         if (useNanoTime){
>>> -            return System.currentTimeMillis() - sampleNsClockInMs();
>>> +            return nanoThreadSleep > 0 ? NanoOffset.getNanoOffset()
:
>>> System.currentTimeMillis() - sampleNsClockInMs();
>>>         } else {
>>>             return Long.MIN_VALUE;
>>>         }
>>>     }
>>>
>>>     public SampleResult() {
>>> -        time = 0;
>>> -        useNanoTime = USENANOTIME;
>>> -        nanoTimeOffset = initOffset();
>>> +        this(USENANOTIME, NANOTHREAD_SLEEP);
>>>     }
>>>
>>>     // Allow test code to change the default useNanoTime setting
>>>     SampleResult(boolean nanoTime) {
>>> -        time = 0;
>>> -        useNanoTime = nanoTime;
>>> -        nanoTimeOffset = initOffset();
>>> +        this(nanoTime, NANOTHREAD_SLEEP);
>>> +    }
>>> +
>>> +    // Allow test code to change the default useNanoTime and
>>> nanoThreadSleep settings
>>> +    SampleResult(boolean nanoTime, long nanoThreadSleep) {
>>> +        this.time = 0;
>>> +        this.useNanoTime = nanoTime;
>>> +        this.nanoThreadSleep = nanoThreadSleep;
>>> +        this.nanoTimeOffset = initOffset();
>>>     }
>>>
>>>     /**
>>> @@ -252,8 +271,7 @@ public class SampleResult implements Ser
>>>      * @param res existing sample result
>>>      */
>>>     public SampleResult(SampleResult res) {
>>> -        useNanoTime = USENANOTIME;
>>> -        nanoTimeOffset = initOffset();
>>> +        this();
>>>         allThreads = res.allThreads;//OK
>>>         assertionResults = res.assertionResults;// TODO ??
>>>         bytes = res.bytes;
>>> @@ -306,8 +324,7 @@ public class SampleResult implements Ser
>>>      *            create the sample finishing now, else starting now
>>>      */
>>>     protected SampleResult(long elapsed, boolean atend) {
>>> -        useNanoTime = USENANOTIME;
>>> -        nanoTimeOffset = initOffset();
>>> +        this();
>>>         long now = currentTimeInMillis();
>>>         if (atend) {
>>>             setTimes(now - elapsed, now);
>>> @@ -357,8 +374,7 @@ public class SampleResult implements Ser
>>>      * @param elapsed
>>>      */
>>>     public SampleResult(long stamp, long elapsed) {
>>> -        useNanoTime = USENANOTIME;
>>> -        nanoTimeOffset = initOffset();
>>> +        this();
>>>         stampAndTime(stamp, elapsed);
>>>     }
>>>
>>> @@ -1246,4 +1262,36 @@ public class SampleResult implements Ser
>>>         this.bodySize = bodySize;
>>>     }
>>>
>>> +    private static class NanoOffset extends Thread {
>>> +
>>> +        private static volatile long nanoOffset =
>>> +                // Make sure we start with a reasonable value
>>> +                System.currentTimeMillis() -
>>> SampleResult.sampleNsClockInMs();
>>> +
>>> +        static long getNanoOffset() {
>>> +            return nanoOffset;
>>> +        }
>>> +
>>> +        @Override
>>> +        public void run() {
>>> +            // Wait longer than a clock pulse (generally 10-15ms)
>>> +            getOffset(30L); // Catch an early clock pulse to reduce slop.
>>> +            while(true) {
>>> +                getOffset(NANOTHREAD_SLEEP); // Can now afford to wait
a
>>> bit longer between checks
>>> +            }
>>> +
>>> +        }
>>> +
>>> +        private void getOffset(long wait) {
>>> +            try {
>>> +                Thread.sleep(wait);
>>> +                long clock = System.currentTimeMillis();
>>> +                long nano = SampleResult.sampleNsClockInMs();
>>> +                nanoOffset = clock - nano;
>>> +            } catch (InterruptedException ignore) {
>>> +                // ignored
>>> +            }
>>> +        }
>>> +
>>> +    }
>>>  }
>>>
>>> Modified:
>>> jmeter/trunk/test/src/org/apache/jmeter/samplers/TestSampleResult.java
>>> URL:
>>> http://svn.apache.org/viewvc/jmeter/trunk/test/src/org/apache/jmeter/samplers/TestSampleResult.java?rev=1215361&r1=1215360&r2=1215361&view=diff
>>>
>>> ==============================================================================
>>> --- jmeter/trunk/test/src/org/apache/jmeter/samplers/TestSampleResult.java
>>> (original)
>>> +++ jmeter/trunk/test/src/org/apache/jmeter/samplers/TestSampleResult.java
>>> Sat Dec 17 00:16:06 2011
>>> @@ -144,18 +144,34 @@ public class TestSampleResult extends Te
>>>             testSubResults(true, 0);
>>>         }
>>>
>>> +        public void testSubResultsTrueThread() throws Exception {
>>> +            testSubResults(true, 500L, 0);
>>> +        }
>>> +
>>>         public void testSubResultsFalse() throws Exception {
>>>             testSubResults(false, 0);
>>>         }
>>>
>>> +        public void testSubResultsFalseThread() throws Exception {
>>> +            testSubResults(false, 500L, 0);
>>> +        }
>>> +
>>>         public void testSubResultsTruePause() throws Exception {
>>>             testSubResults(true, 100);
>>>         }
>>>
>>> +        public void testSubResultsTruePauseThread() throws Exception {
>>> +            testSubResults(true, 500L, 100);
>>> +        }
>>> +
>>>         public void testSubResultsFalsePause() throws Exception {
>>>             testSubResults(false, 100);
>>>         }
>>>
>>> +        public void testSubResultsFalsePauseThread() throws Exception {
>>> +            testSubResults(false, 500L, 100);
>>> +        }
>>> +
>>>         // temp test case for exploring settings
>>>         public void xtestUntilFail() throws Exception {
>>>             while(true) {
>>> @@ -165,12 +181,19 @@ public class TestSampleResult extends Te
>>>         }
>>>
>>>         private void testSubResults(boolean nanoTime, long pause) throws
>>> Exception {
>>> +            testSubResults(nanoTime, 0L, pause); // Don't use nanoThread
>>> +        }
>>> +
>>> +        private void testSubResults(boolean nanoTime, long
>>> nanoThreadSleep, long pause) throws Exception {
>>>             // This test tries to emulate a http sample, with two
>>>             // subsamples, representing images that are downloaded for
the
>>>             // page representing the first sample.
>>>
>>>             // Sample that will get two sub results, simulates a web page
>>> load
>>> -            SampleResult parent = new SampleResult(nanoTime);
>>> +            SampleResult parent = new SampleResult(nanoTime,
>>> nanoThreadSleep);
>>> +
>>> +            assertEquals(nanoTime, parent.useNanoTime);
>>> +            assertEquals(nanoThreadSleep, parent.nanoThreadSleep);
>>>
>>>             long beginTest = parent.currentTimeInMillis();
>>>
>>>
>>> Modified: jmeter/trunk/xdocs/changes.xml
>>> URL:
>>> http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1215361&r1=1215360&r2=1215361&view=diff
>>>
>>> ==============================================================================
>>> --- jmeter/trunk/xdocs/changes.xml (original)
>>> +++ jmeter/trunk/xdocs/changes.xml Sat Dec 17 00:16:06 2011
>>> @@ -235,6 +235,7 @@ Loads any additional properties found in
>>>  <li>Bug 51093 - when loading a selection previously stored by "Save
>>> Selection As", show the file name in the blue window bar</li>
>>>  <li>Bug 50086 - Password fields not Hidden in JMS Publisher, JMS
>>> Subscriber, Mail Reader sampler, SMTP sampler and Database
>>> Configuration</li>
>>>  <li>Added DiskStore remote sample sender: like Hold, but saves samples
to
>>> disk until end of test.</li>
>>> +<li>Bug 52333 - Reduce overhead in calculating
>>> SampleResult#nanoTimeOffset</li>
>>>  </ul>
>>>
>>>  <h2>Non-functional changes</h2>
>>>
>>> Modified: jmeter/trunk/xdocs/usermanual/listeners.xml
>>> URL:
>>> http://svn.apache.org/viewvc/jmeter/trunk/xdocs/usermanual/listeners.xml?rev=1215361&r1=1215360&r2=1215361&view=diff
>>>
>>> ==============================================================================
>>> --- jmeter/trunk/xdocs/usermanual/listeners.xml (original)
>>> +++ jmeter/trunk/xdocs/usermanual/listeners.xml Sat Dec 17 00:16:06 2011
>>> @@ -157,6 +157,12 @@ The full set of properties that affect r
>>>  # Put the start time stamp in logs instead of the end
>>>  sampleresult.timestamp.start=true
>>>
>>> +# Whether to use System.nanoTime() - otherwise only use
>>> System.currentTimeMillis()
>>> +#sampleresult.useNanoTime=true
>>> +
>>> +# Use a background thread to calculate the nanoTime offset
>>> +# Set this to <= 0 to disable the background thread
>>> +#sampleresult.nanoThreadSleep=5000
>>>
>>>  # legitimate values: none, first, all
>>>  #jmeter.save.saveservice.assertion_results=none
>>>
>>>
>>>
>>
>>
>> --
>> Cordialement.
>> Philippe Mouawad.

Mime
View raw message