<br><br><div class="gmail_quote">On Thu, Dec 9, 2010 at 12:04 PM, Tyler Roscoe <span dir="ltr">&lt;<a href="mailto:tyler@cryptio.net">tyler@cryptio.net</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Ok I&#39;ve added a link to this thread and the patch below to the bug:<br>
<a href="http://www.vtk.org/Bug/view.php?id=11561" target="_blank">http://www.vtk.org/Bug/view.php?id=11561</a><br>
<br>
Without feedback from anyone, I will assume that I have done an awesome,<br>
production-ready job and will await the call for patches to add to CMake<br>
2.8.4.<br>
<br>
Thanks,<br>
<font color="#888888">tyler<br>
</font><div><div></div><div class="h5"><br>
On Tue, Dec 07, 2010 at 09:37:09PM -0800, Tyler Roscoe wrote:<br>
&gt; In the process of attempting to fix this, I learned a lot of stuff about<br>
&gt; how COST is handled that I&#39;ve never encountered in the docs. Am I<br>
&gt; missing something?<br>
&gt;<br>
&gt; Here are some notes I made about the behavior of COST in CTest. If<br>
&gt; others find them useful, I&#39;d be happy to put them in the Wiki if someone<br>
&gt; could nominate an appropriate place.<br>
&gt;<br>
&gt; - Any COST property you set on a test is only a starting point. CTest<br>
&gt;   calculates an average cost value for a test each time that test is<br>
&gt; run. This value is cached in Testing/Temporary/CTestCostData.txt.<br>
&gt;<br>
&gt; - Tests that fail are also stored in<br>
&gt;   Testing/Temporary/CTestCostData.txt. On the next run, these tests have<br>
&gt; their cost set to the maximum to insure that they are run first. I<br>
&gt; believe this factors into later averaging, so that tests that fail more<br>
&gt; frequently run earlier than tests that faill less frequently.<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; So, my solution. I&#39;ve tried to implement Zach&#39;s suggested &quot;middle<br>
&gt; ground&quot;.<br>
&gt;<br>
&gt; For non-parallel CTest runs:<br>
&gt;<br>
&gt; - The &quot;run failed tests first&quot; behavior is disabled to prevent failed<br>
&gt;   tests from clobbering their given COST property.<br>
&gt;<br>
&gt; - The stored values in CTestCostData.txt are not used.<br>
&gt;<br>
&gt; - As long as std::sort() is stable, the COST for each test should remain<br>
&gt;   0 and the tests should run in the order encountered in CMakeLists.txt.<br>
&gt;<br>
&gt; For parallel CTest runs, failed tests run first and the moving average<br>
&gt; is calculated and used. I think it makes sense that if you ask for tests<br>
&gt; to run in parallel, you probably don&#39;t care so much about the order<br>
&gt; (modulo test dependencies) so it is more reasonable to throw out the<br>
&gt; COST data provided by the CMakeLists.txt.<br>
&gt;<br>
&gt; I&#39;m not really a C++ dev so please let me know if I&#39;m way off base.<br>
&gt; This patch appears to solve my immediate problem but if it can be<br>
&gt; included upstream that is better for everyone.<br>
&gt;<br>
&gt; The patch is against the 2.8.3 release.<br>
&gt;<br>
&gt; I&#39;ve also included a simple CMakeLists.txt for testing and verifying<br>
&gt; behavior. Unpatched ctest 2.8.3 runs the tests in reverse order. Patched<br>
&gt; ctest runs them according to COST.<br>
&gt;<br>
&gt; ######################<br>
&gt; ####### PATCH ########<br>
&gt; ######################<br>
&gt;<br>
&gt; --- ./Source/CTest/cmCTestMultiProcessHandler.cxx.orig  2010-12-07 15:31:57.091228582 -0800<br>
&gt; +++ ./Source/CTest/cmCTestMultiProcessHandler.cxx       2010-12-07 19:59:11.115740666 -0800<br>
&gt; @@ -434,9 +434,14 @@<br>
&gt;        if(index == -1) continue;<br>
&gt;<br>
&gt;        this-&gt;Properties[index]-&gt;PreviousRuns = prev;<br>
&gt; -      if(this-&gt;Properties[index] &amp;&amp; this-&gt;Properties[index]-&gt;Cost == 0)<br>
&gt; +      // When not running in parallel mode, don&#39;t clobber test&#39;s cost with<br>
&gt; +      // running average.<br>
&gt; +      if(this-&gt;ParallelLevel &gt; 1)<br>
&gt;          {<br>
&gt; -        this-&gt;Properties[index]-&gt;Cost = cost;<br>
&gt; +        if(this-&gt;Properties[index] &amp;&amp; this-&gt;Properties[index]-&gt;Cost == 0)<br>
&gt; +          {<br>
&gt; +          this-&gt;Properties[index]-&gt;Cost = cost;<br>
&gt; +          }<br>
&gt;          }<br>
&gt;        }<br>
&gt;      // Next part of the file is the failed tests<br>
&gt; @@ -475,20 +480,23 @@<br>
&gt;      {<br>
&gt;      SortedTests.push_back(i-&gt;first);<br>
&gt;<br>
&gt; -    //If the test failed last time, it should be run first, so max the cost<br>
&gt; -    if(std::find(this-&gt;LastTestsFailed.begin(),<br>
&gt; -                 this-&gt;LastTestsFailed.end(),<br>
&gt; -                 this-&gt;Properties[i-&gt;first]-&gt;Name)<br>
&gt; -       != this-&gt;LastTestsFailed.end())<br>
&gt; +    //If the test failed last time, it should be run first, so max the cost.<br>
&gt; +    //Only do this for parallel runs; in non-parallel runs, avoid clobbering<br>
&gt; +    //the test&#39;s original cost.<br>
&gt; +    if(this-&gt;ParallelLevel &gt; 1)<br>
&gt;        {<br>
&gt; -      this-&gt;Properties[i-&gt;first]-&gt;Cost = FLT_MAX;<br>
&gt; +      if(std::find(this-&gt;LastTestsFailed.begin(),<br>
&gt; +                   this-&gt;LastTestsFailed.end(),<br>
&gt; +                   this-&gt;Properties[i-&gt;first]-&gt;Name)<br>
&gt; +         != this-&gt;LastTestsFailed.end())<br>
&gt; +        {<br>
&gt; +        this-&gt;Properties[i-&gt;first]-&gt;Cost = FLT_MAX;<br>
&gt; +        }<br>
&gt;        }<br>
&gt;      }<br>
&gt; -  if(this-&gt;ParallelLevel &gt; 1)<br>
&gt; -    {<br>
&gt; +<br>
&gt;      TestComparator comp(this);<br>
&gt;      std::sort(SortedTests.begin(), SortedTests.end(), comp);<br>
&gt; -    }<br>
&gt;  }<br>
&gt;<br>
&gt;  //---------------------------------------------------------<br>
&gt;<br>
&gt; ##########################<br>
&gt; ####### TEST CASE ########<br>
&gt; ##########################<br>
&gt;<br>
&gt; cmake_minimum_required(VERSION 2.8)<br>
&gt; project(p)<br>
&gt; enable_testing()<br>
&gt;<br>
&gt; # Add in reverse order to make sure COST rather than order of add_test()<br>
&gt; # commands really controls execution order.<br>
&gt; add_test (i_should_run_fifth ${CMAKE_COMMAND} -E echo i should run fifth)<br>
&gt; set_tests_properties (i_should_run_fifth PROPERTIES COST -100)<br>
&gt;<br>
&gt; add_test (i_should_run_fourth ${CMAKE_COMMAND} -E echo i should run fourth)<br>
&gt; set_tests_properties (i_should_run_fourth PROPERTIES COST -1)<br>
&gt;<br>
&gt; add_test (i_should_run_third ${CMAKE_COMMAND} -E echo i should run third)<br>
&gt; set_tests_properties (i_should_run_third PROPERTIES COST 1)<br>
&gt;<br>
&gt; add_test (i_should_run_first ${CMAKE_COMMAND} -E echo i should run first)<br>
&gt; set_tests_properties (i_should_run_first PROPERTIES COST 100)<br>
&gt;<br>
&gt; # In serial mode, this test should always run second.<br>
&gt; #<br>
&gt; # In parallel mode (ctest -jN, N&gt;1), this test should run second in a fresh<br>
&gt; # binary directory. Otherwise, since it failed previously, it should run first.<br>
&gt; add_test (i_should_fail_and_run_second_or_first ${CMAKE_COMMAND} -E echo i should fail and run second)<br>
&gt; set_tests_properties (i_should_fail_and_run_second_or_first PROPERTIES<br>
&gt;     WILL_FAIL TRUE<br>
&gt;     COST 50<br>
&gt; )<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; On Thu, Dec 02, 2010 at 08:54:12AM -0800, Tyler Roscoe wrote:<br>
&gt; &gt; I&#39;ve taken the liberty of adding this bug to the tracker:<br>
&gt; &gt; <a href="http://www.cmake.org/Bug/view.php?id=11561" target="_blank">http://www.cmake.org/Bug/view.php?id=11561</a><br>
</div></div><div><div></div><div class="h5">&gt; _______________________________________________<br>
&gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;<br>
&gt; Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;<br>
&gt; Please keep messages on-topic and check the CMake FAQ at: <a href="http://www.cmake.org/Wiki/CMake_FAQ" target="_blank">http://www.cmake.org/Wiki/CMake_FAQ</a><br>
&gt;<br>
&gt; Follow this link to subscribe/unsubscribe:<br>
&gt; <a href="http://www.cmake.org/mailman/listinfo/cmake" target="_blank">http://www.cmake.org/mailman/listinfo/cmake</a><br>
</div></div></blockquote></div>Tyler,<div><br></div><div>Thanks for the patch :)<br><br clear="all"><br>-- <br>Zach Mullen<div>R &amp; D Engineer<br>Kitware Inc.<br>(919) 969-6990 x314</div><br>
</div>