You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jmeter.apache.org by Philippe Mouawad <ph...@gmail.com> on 2011/12/28 17:35:36 UTC

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

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

Regards
Merry Christmas by the way.

Philippe

On Sat, Dec 17, 2011 at 1:16 AM, <se...@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.

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

Posted by sebb <se...@gmail.com>.
On 29 December 2011 23:40, sebb <se...@gmail.com> wrote:
> On 28 December 2011 16:35, Philippe Mouawad <ph...@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, <se...@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.

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

Posted by sebb <se...@gmail.com>.
On 28 December 2011 16:35, Philippe Mouawad <ph...@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, <se...@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.