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, 29 Dec 2011 23:40:07 GMT
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).

> 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