On 28 December 2011 16:35, Philippe Mouawad <philippe.moua...@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, <s...@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.