The Windows debug build has some runtime tests (in the debug version of the MSVC "C" runtime library) that other builds don't have. test.exe prints some errors in its debug build that indicate code problems.
http://buildbot.mongodb.org/builders/Windows%2064-bit%20DEBUG/builds/928/steps/test_1/logs/stdio
http://buildlogs.mongodb.org/Windows%2064-bit%20DEBUG/builds/928/test/core/test.exe
Sat Aug 03 11:20:17.980 [testsuite] going to run suite: query_stage_merge_sort_test Sat Aug 03 11:20:17.980 [testsuite] going to run test: class QueryStageMergeSortTests::QueryStageMergeSortPrefixIndex Sat Aug 03 11:20:17.996 [testsuite] build index unittests.QueryStageMergeSort { _id: 1 } Sat Aug 03 11:20:17.996 [testsuite] build index done. scanned 0 total records. 0.001 secs Sat Aug 03 11:20:18.058 [testsuite] build index unittests.QueryStageMergeSort { a: 1, c: 1 } Sat Aug 03 11:20:18.074 [testsuite] build index done. scanned 100 total records. 0.014 secs Sat Aug 03 11:20:18.074 [testsuite] build index unittests.QueryStageMergeSort { b: 1, c: 1 } Sat Aug 03 11:20:18.089 [testsuite] build index done. scanned 100 total records. 0.014 secs Sat Aug 03 11:20:18.089 [testsuite] *** C runtime error: C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\algorithm(2457) : Assertion failed: invalid operator< Sat Aug 03 11:20:18.978 [testsuite] test.exe ...\src\mongo\util\stacktrace.cpp(169) mongo::printStackTrace+0x5b Sat Aug 03 11:20:18.978 [testsuite] test.exe ...\src\mongo\util\stacktrace.cpp(284) mongo::crtDebugCallback+0x137 Sat Aug 03 11:20:18.978 [testsuite] test.exe f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgrptt.c(605) _VCrtDbgReportW+0x812 Sat Aug 03 11:20:18.978 [testsuite] test.exe f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgrpt.c(242) _CrtDbgReportWV+0x43 Sat Aug 03 11:20:18.978 [testsuite] test.exe f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgrpt.c(258) _CrtDbgReportW+0x4d Sat Aug 03 11:20:18.978 [testsuite] test.exe f:\dd\vctools\crt_bld\self_64_amd64\crt\src\stdthrow.cpp(13) std::_Debug_message+0x34 Sat Aug 03 11:20:18.978 [testsuite] test.exe c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(690) std::_Debug_lt_pred<mongo::MergeSortStage::StageWithValueComparison,std::_List_iterator<std::_List_val<mongo::MergeSortStage::StageWithValue,std::allocator<mongo::MergeSortStage::StageWithValue> > >,std::_List_iterator<std::_List_val<mongo::MergeSortStage::StageWithValue,std::allocator<mongo::MergeSortStage::StageWithValue> > > >+0x9a Sat Aug 03 11:20:18.978 [testsuite] test.exe c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm(2458) std::_Push_heap<std::_List_iterator<std::_List_val<mongo::MergeSortStage::StageWithValue,std::allocator<mongo::MergeSortStage::StageWithValue> > > * __ptr64,__int64,std::_List_iterator<std::_List_val<mongo::MergeSortStage::StageWithValue,std::allocator<mongo::MergeSortStage::StageWithValue> > >,mongo::MergeSortStage::StageWithValueComparison>+0xe7 Sat Aug 03 11:20:18.978 [testsuite] test.exe c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm(2477) std::_Push_heap_0<std::_List_iterator<std::_List_val<mongo::MergeSortStage::StageWithValue,std::allocator<mongo::MergeSortStage::StageWithValue> > > * __ptr64,__int64,std::_List_iterator<std::_List_val<mongo::MergeSortStage::StageWithValue,std::allocator<mongo::MergeSortStage::StageWithValue> > >,mongo::MergeSortStage::StageWithValueComparison>+0xf5 Sat Aug 03 11:20:18.978 [testsuite] test.exe c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm(2492) std::push_heap<std::_Vector_iterator<std::_Vector_val<std::_List_iterator<std::_List_val<mongo::MergeSortStage::StageWithValue,std::allocator<mongo::MergeSortStage::StageWithValue> > >,std::allocator<std::_List_iterator<std::_List_val<mongo::MergeSortStage::StageWithValue,std::allocator<mongo::MergeSortStage::StageWithValue> > > > > >,mongo::MergeSortStage::StageWithValueComparison>+0x34d Sat Aug 03 11:20:18.978 [testsuite] test.exe c:\program files (x86)\microsoft visual studio 10.0\vc\include\queue(305) std::priority_queue<std::_List_iterator<std::_List_val<mongo::MergeSortStage::StageWithValue,std::allocator<mongo::MergeSortStage::StageWithValue> > >,std::vector<std::_List_iterator<std::_List_val<mongo::MergeSortStage::StageWithValue,std::allocator<mongo::MergeSortStage::StageWithValue> > >,std::allocator<std::_List_iterator<std::_List_val<mongo::MergeSortStage::StageWithValue,std::allocator<mongo::MergeSortStage::StageWithValue> > > > >,mongo::MergeSortStage::StageWithValueComparison>::push+0x102 Sat Aug 03 11:20:18.978 [testsuite] test.exe ...\src\mongo\db\exec\merge_sort.cpp(99) mongo::MergeSortStage::work+0x34d Sat Aug 03 11:20:18.978 [testsuite] test.exe ...\src\mongo\db\query\simple_plan_runner.h(57) mongo::SimplePlanRunner::getNext+0x7e Sat Aug 03 11:20:18.978 [testsuite] test.exe ...\src\mongo\dbtests\query_stage_merge_sort.cpp(132) QueryStageMergeSortTests::QueryStageMergeSortPrefixIndex::run+0x880 Sat Aug 03 11:20:18.978 [testsuite] test.exe ...\src\mongo\unittest\unittest.h(296) mongo::unittest::Suite::runTestObject<QueryStageMergeSortTests::QueryStageMergeSortPrefixIndex>+0x33 Sat Aug 03 11:20:18.978 [testsuite] test.exe ...\src\third_party\boost\boost\function\function_template.hpp(113) boost::detail::function::void_function_invoker0<void (__cdecl*)(void),void>::invoke+0x2f Sat Aug 03 11:20:18.978 [testsuite] test.exe ...\src\third_party\boost\boost\function\function_template.hpp(761) boost::function0<void>::operator()+0x87 Sat Aug 03 11:20:18.978 [testsuite] test.exe ...\src\mongo\unittest\unittest.h(194) mongo::unittest::TestHolder::run+0x2f Sat Aug 03 11:20:18.978 [testsuite] test.exe ...\src\mongo\unittest\unittest.cpp(164) mongo::unittest::Suite::run+0x74b Sat Aug 03 11:20:18.978 [testsuite] test.exe ...\src\mongo\unittest\unittest.cpp(228) mongo::unittest::Suite::run+0x498
This problem produces a scarier-looking "Assertion failed: invalid heap" as well:
Sat Aug 03 11:20:19.930 [testsuite] *** C runtime error: C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\algorithm(2387) : Assertion failed: invalid heap
Sat Aug 03 11:20:20.804 [testsuite] test.exe ...\src\mongo\util\stacktrace.cpp(169) mongo::printStackTrace+0x5b
Sat Aug 03 11:20:20.804 [testsuite] test.exe ...\src\mongo\util\stacktrace.cpp(284) mongo::crtDebugCallback+0x137
Sat Aug 03 11:20:20.804 [testsuite] test.exe f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgrptt.c(605) _VCrtDbgReportW+0x812
Sat Aug 03 11:20:20.804 [testsuite] test.exe f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgrpt.c(242) _CrtDbgReportWV+0x43
Sat Aug 03 11:20:20.804 [testsuite] test.exe f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgrpt.c(258) _CrtDbgReportW+0x4d
Sat Aug 03 11:20:20.804 [testsuite] test.exe f:\dd\vctools\crt_bld\self_64_amd64\crt\src\stdthrow.cpp(13) std::_Debug_message+0x34
Sat Aug 03 11:20:20.804 [testsuite] test.exe c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm(2387) std::_Debug_heap<std::_List_iterator<std::_List_val<mongo::MergeSortStage::StageWithValue,std::allocator<mongo::MergeSortStage::StageWithValue> > > * __ptr64,mongo::MergeSortStage::StageWithValueComparison>+0x101
Sat Aug 03 11:20:20.804 [testsuite] test.exe c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm(2622) std::pop_heap<std::_Vector_iterator<std::_Vector_val<std::_List_iterator<std::_List_val<mongo::MergeSortStage::StageWithValue,std::allocator<mongo::MergeSortStage::StageWithValue> > >,std::allocator<std::_List_iterator<std::_List_val<mongo::MergeSortStage::StageWithValue,std::allocator<mongo::MergeSortStage::StageWithValue> > > > > >,mongo::MergeSortStage::StageWithValueComparison>+0x1a3
Sat Aug 03 11:20:20.804 [testsuite] test.exe c:\program files (x86)\microsoft visual studio 10.0\vc\include\queue(349) std::priority_queue<std::_List_iterator<std::_List_val<mongo::MergeSortStage::StageWithValue,std::allocator<mongo::MergeSortStage::StageWithValue> > >,std::vector<std::_List_iterator<std::_List_val<mongo::MergeSortStage::StageWithValue,std::allocator<mongo::MergeSortStage::StageWithValue> > >,std::allocator<std::_List_iterator<std::_List_val<mongo::MergeSortStage::StageWithValue,std::allocator<mongo::MergeSortStage::StageWithValue> > > > >,mongo::MergeSortStage::StageWithValueComparison>::pop+0xe0
Sat Aug 03 11:20:20.804 [testsuite] test.exe ...\src\mongo\db\exec\merge_sort.cpp(131) mongo::MergeSortStage::work+0x4c4
Sat Aug 03 11:20:20.804 [testsuite] test.exe ...\src\mongo\db\query\simple_plan_runner.h(57) mongo::SimplePlanRunner::getNext+0x7e
Sat Aug 03 11:20:20.804 [testsuite] test.exe ...\src\mongo\dbtests\query_stage_merge_sort.cpp(132) QueryStageMergeSortTests::QueryStageMergeSortPrefixIndex::run+0x880
Sat Aug 03 11:20:20.804 [testsuite] test.exe ...\src\mongo\unittest\unittest.h(296) mongo::unittest::Suite::runTestObject<QueryStageMergeSortTests::QueryStageMergeSortPrefixIndex>+0x33
Sat Aug 03 11:20:20.804 [testsuite] test.exe ...\src\third_party\boost\boost\function\function_template.hpp(113) boost::detail::function::void_function_invoker0<void (__cdecl*)(void),void>::invoke+0x2f
Sat Aug 03 11:20:20.804 [testsuite] test.exe ...\src\third_party\boost\boost\function\function_template.hpp(761) boost::function0<void>::operator()+0x87
Sat Aug 03 11:20:20.804 [testsuite] test.exe ...\src\mongo\unittest\unittest.h(194) mongo::unittest::TestHolder::run+0x2f
Sat Aug 03 11:20:20.804 [testsuite] test.exe ...\src\mongo\unittest\unittest.cpp(164) mongo::unittest::Suite::run+0x74b
Sat Aug 03 11:20:20.804 [testsuite] test.exe ...\src\mongo\unittest\unittest.cpp(228) mongo::unittest::Suite::run+0x498
Sat Aug 03 11:20:20.804 [testsuite] test.exe ...\src\mongo\dbtests\framework.cpp(270) mongo::dbtests::runDbTests+0x1328
Sat Aug 03 11:20:20.804 [testsuite] test.exe ...\src\mongo\dbtests\dbtests.cpp(41) dbtestsMain+0x170
The problem code is src/mongo/db/exec/merge_sort.cpp line 205 (line 26 below):
// Is lhs less than rhs? Note that priority_queue is a max heap by default so we invert // the return from the expected value. bool MergeSortStage::StageWithValueComparison::operator()( const MergingRef& lhs, const MergingRef& rhs) { WorkingSetMember* lhsMember = _ws->get(lhs->id); WorkingSetMember* rhsMember = _ws->get(rhs->id); BSONObjIterator it(_pattern); while (it.more()) { BSONElement patternElt = it.next(); string fn = patternElt.fieldName(); BSONElement lhsElt; verify(lhsMember->getFieldDotted(fn, &lhsElt)); BSONElement rhsElt; verify(rhsMember->getFieldDotted(fn, &rhsElt)); // false means don't compare field name. int x = lhsElt.woCompare(rhsElt, false); if (-1 == patternElt.number()) { x = -x; } if (x != 0) { return x > 0; } } return true; }
Since the comparison function is supposed to return true or false in answer to the question "Is lhs less than rhs?" (strict weak ordering), the correct return value for equal items is 'false'.