On 29 December 2011 23:40, sebb <seb...@gmail.com> wrote: > 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).
Fixed in r1227444 >> 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.