Author: sebb
Date: Wed Sep 21 00:48:08 2011
New Revision: 1173443

URL: http://svn.apache.org/viewvc?rev=1173443&view=rev
Log:
Bug 51855 - Parent samples may have slightly inaccurate elapsed times 

Modified:
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java
    
jakarta/jmeter/trunk/test/src/org/apache/jmeter/samplers/TestSampleResult.java
    jakarta/jmeter/trunk/xdocs/changes.xml

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java?rev=1173443&r1=1173442&r2=1173443&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java 
(original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/samplers/SampleResult.java 
Wed Sep 21 00:48:08 2011
@@ -538,7 +538,7 @@ public class SampleResult implements Ser
         subResult.setThreadName(tn); // TODO is this really necessary?
 
         // Extend the time to the end of the added sample
-        setEndTime(Math.max(getEndTime(), subResult.getEndTime()));
+        setEndTime(Math.max(getEndTime(), subResult.getEndTime() + 
nanoTimeOffset - subResult.nanoTimeOffset)); // Bug 51855
         // Include the byte count for the added sample
         setBytes(getBytes() + subResult.getBytes());
         addRawSubResult(subResult);

Modified: 
jakarta/jmeter/trunk/test/src/org/apache/jmeter/samplers/TestSampleResult.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/test/src/org/apache/jmeter/samplers/TestSampleResult.java?rev=1173443&r1=1173442&r2=1173443&view=diff
==============================================================================
--- 
jakarta/jmeter/trunk/test/src/org/apache/jmeter/samplers/TestSampleResult.java 
(original)
+++ 
jakarta/jmeter/trunk/test/src/org/apache/jmeter/samplers/TestSampleResult.java 
Wed Sep 21 00:48:08 2011
@@ -210,22 +210,29 @@ public class TestSampleResult extends Te
             
             long overallTime = parent.currentTimeInMillis() - beginTest;
 
-            // Check the sample times
-            final long fudge1 = 15;
             long sumSamplesTimes = parentElapsed + child1Elapsed + 
child2Elapsed;
-            if (parentElapsedTotal + fudge1 < sumSamplesTimes) { // Add fudge 
factor
-                fail("Total: " + parentElapsedTotal + " " + fudge1 + " < 
sum(samples): "+ sumSamplesTimes);
-            }
+            
             /*
-             * The granularity of System.currentTimeMillis() - plus the fact 
that the nanoTime()
-             * offset is now calculated for each sampleResult - means that 
there can be some
-             * minor variation in the value returned by 
SampleResult#currentTimeInMillis().
-             * 
-             * Allow for this by adding a fudge factor
-            */
-            long fudge2 = 13;
-            if (parentElapsedTotal > overallTime + fudge2) {
-                fail("Total: "+parentElapsedTotal+" > overall time: "+ 
overallTime + " + " + fudge2);
+             * Parent elapsed total should be no smaller than the sum of the 
individual samples.
+             * It may be greater by the timer granularity.
+             */
+            
+            long diff = parentElapsedTotal - sumSamplesTimes;
+            long maxDiff = nanoTime ? 1 : 16; // TimeMillis has granularity of 
10-20
+            if (diff < 0 || diff > maxDiff) {
+                fail("ParentElapsed: " + parentElapsedTotal + " - " + " 
sum(samples): " + sumSamplesTimes
+                        + " = " + diff + " not in [0," + maxDiff + "]; 
nanotime=" + nanoTime);
+            }
+
+            /**
+             * The overall time to run the test must be no less than, 
+             * and may be greater (but not much greater) than the parent 
elapsed time
+             */
+            
+            diff = overallTime - parentElapsedTotal;
+            if (diff < 0 || diff > maxDiff) {
+                fail("TestElapsed: " + overallTime + " - " + " ParentElapsed: 
" + parentElapsedTotal
+                        + " = " + diff + " not in [0," + maxDiff + "]; 
nanotime="+nanoTime);
             }
             
             // Check that calculator gets the correct statistics from the 
sample
@@ -236,6 +243,7 @@ public class TestSampleResult extends Te
             assertEquals(1d / (parentElapsedTotal / 1000d), 
calculator.getRate(),0.0001d); // Allow for some margin of error
             // Check that the throughput uses the time elapsed for the sub 
results
             assertFalse(1d / (parentElapsed / 1000d) <= calculator.getRate());
+            System.out.print(nanoTime? 'T' : 'F');
         }
 
         // TODO some more invalid sequence tests needed

Modified: jakarta/jmeter/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/changes.xml?rev=1173443&r1=1173442&r2=1173443&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/changes.xml (original)
+++ jakarta/jmeter/trunk/xdocs/changes.xml Wed Sep 21 00:48:08 2011
@@ -130,6 +130,7 @@ This can be overridden by setting the JM
 <li>Bug 47921 - Variables not released for GC after JMeterThread exits.</li>
 <li>Bug 51839 - "... end of run" printed prematurely</li>
 <li>Bug 51847 - Some Junit tests are Locale sensitive and fail if Locale is 
different from US</li>
+<li>Bug 51855 - Parent samples may have slightly inaccurate elapsed times</li>
 </ul>
 
 <!-- ==================================================== -->



---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@jakarta.apache.org
For additional commands, e-mail: notifications-h...@jakarta.apache.org

Reply via email to