Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-10496

Unit test ExpressionTests::Set failure on Windows and C++11 builds

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Critical - P2
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 2.5.2
    • Component/s: Testing Infrastructure
    • Labels:
    • Environment:
      Windows, OS X C++11 builds with libc++
    • Operating System:
      ALL

      Description

      Windows and OSX C++11 builders have been failing unit tests recently.

      Example 1: Windows 64-bit Build #5644 (Aug 9, rev cd81198d)

      http://buildlogs.mongodb.org/Windows%2064-bit/builds/5644/test/core/test.exe

      Fri Aug 09 19:25:37.429 [testsuite] 	 going to run test: class ExpressionTests::Set::NoOverlap
      Fri Aug 09 19:25:37.429 [testsuite]  Assertion failure 0 D:\slave\Windows_64bit\mongo\src\mongo/bson/bsontypes.h 155
      Fri Aug 09 19:25:38.272 [testsuite] FAIL: class ExpressionTests::Set::NoOverlap	 std::exception: assertion D:\slave\Windows_64bit\mongo\src\mongo/bson/bsontypes.h:155 in test class ExpressionTests::Set::NoOverlap
      Fri Aug 09 19:25:38.272 [testsuite] 	 going to run test: class ExpressionTests::Set::Overlap
      Fri Aug 09 19:25:38.272 [testsuite] *** unhandled exception (access violation) at 0x000000013FC40176, terminating
      Fri Aug 09 19:25:38.272 [testsuite] *** access violation was a read from 0xFFFFFFFFFFFFFFFF

      Example 2: OS X C++11: http://buildlogs.mongodb.org/mci_0.9_osx_108_cxx11_debug/builds/198/test/core_0/test

      Mon Aug 12 17:24:44.241 [testsuite] expression           | tests:  298 | fails:    1 | assert calls:    680
      	ExpressionTests::Set::NoOverlap	for expression $setIntersection with argument [[1, 2], [8, 4]] full tree: {$setIntersection: [{$const: [1, 2]}, {$const: [8, 4]}]} expected: [] but got: [1] @src/mongo/dbtests/expressiontests.cpp:2930

      Windows: http://buildlogs.mongodb.org/mci_0.9_windows_64/builds/481/test/core_0/test.exe

      The breakage was bisected to: https://github.com/mongodb/mongo/commit/af6828e05aaea88e181cad598cc1274e2838d25a

      Running the test under valgrind on OS X shows a use after free:

      Mon Aug 12 19:28:18.169 [testsuite] 	 going to run test: ExpressionTests::Set::NoOverlap
      ==14518== Invalid read of size 8
      ==14518==    at 0x100DABD21: mongo::ExpressionSetIntersection::evaluateInternal(mongo::Variables const&) const (__hash_table:196)
      ==14518==    by 0x1001A00A5: mongo::Expression::evaluate(mongo::Variables const&) const (expression.h:127)
      ==14518==    by 0x10019FE16: mongo::Expression::evaluate(mongo::Document const&) const (expression.h:123)
      ==14518==    by 0x1001A38A5: ExpressionTests::Set::ExpectedResultBase::run() (expressiontests.cpp:2919)
      ==14518==    by 0x1001AA810: void mongo::unittest::Suite::runTestObject<ExpressionTests::Set::NoOverlap>() (unittest.h:296)
      ==14518==    by 0x10000AF89: boost::detail::function::void_function_invoker0<void (*)(), void>::invoke(boost::detail::function::function_buffer&) (function_template.hpp:112)
      ==14518==    by 0x1011D915A: boost::function0<void>::operator()() const (function_template.hpp:759)
      ==14518==    by 0x1011D398B: mongo::unittest::TestHolder::run() const (unittest.h:194)
      ==14518==    by 0x1011D04D5: mongo::unittest::Suite::run(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) (unittest.cpp:164)
      ==14518==    by 0x1011D1F77: mongo::unittest::Suite::run(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) (unittest.cpp:228)
      ==14518==    by 0x100F94D97: mongo::dbtests::runDbTests(int, char**, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) (framework.cpp:270)
      ==14518==    by 0x100123355: dbtestsMain(int, char**, char**) (dbtests.cpp:40)
      ==14518==  Address 0x10681c460 is 0 bytes inside a block of size 32 free'd
      ==14518==    at 0x4D0B: free (vg_replace_malloc.c:450)
      ==14518==    by 0x100DB519A: std::__1::__hash_table<mongo::Value, mongo::Value::Hash, std::__1::equal_to<mongo::Value>, std::__1::allocator<mongo::Value> >::erase(std::__1::__hash_const_iterator<std::__1::__hash_node<mongo::Value, void*> const*>) (memory:1672)
      ==14518==    by 0x100DB4B97: unsigned long std::__1::__hash_table<mongo::Value, mongo::Value::Hash, std::__1::equal_to<mongo::Value>, std::__1::allocator<mongo::Value> >::__erase_unique<mongo::Value>(mongo::Value const&) (__hash_table:1731)
      ==14518==    by 0x100DABCCD: mongo::ExpressionSetIntersection::evaluateInternal(mongo::Variables const&) const (__hash_table:189)
      ==14518==    by 0x1001A00A5: mongo::Expression::evaluate(mongo::Variables const&) const (expression.h:127)
      ==14518==    by 0x10019FE16: mongo::Expression::evaluate(mongo::Document const&) const (expression.h:123)
      ==14518==    by 0x1001A38A5: ExpressionTests::Set::ExpectedResultBase::run() (expressiontests.cpp:2919)
      ==14518==    by 0x1001AA810: void mongo::unittest::Suite::runTestObject<ExpressionTests::Set::NoOverlap>() (unittest.h:296)
      ==14518==    by 0x10000AF89: boost::detail::function::void_function_invoker0<void (*)(), void>::invoke(boost::detail::function::function_buffer&) (function_template.hpp:112)
      ==14518==    by 0x1011D915A: boost::function0<void>::operator()() const (function_template.hpp:759)
      ==14518==    by 0x1011D398B: mongo::unittest::TestHolder::run() const (unittest.h:194)
      ==14518==    by 0x1011D04D5: mongo::unittest::Suite::run(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int) (unittest.cpp:164)
      ==14518==
      Mon Aug 12 19:28:18.278 [testsuite] FAIL: ExpressionTests::Set::NoOverlap	for expression $setIntersection with argument [[1, 2], [8, 4]] full tree: {$setIntersection: [{$const: [1, 2]}, {$const: [8, 4]}]} expected: [] but got: [1] @src/mongo/dbtests/expressiontests.cpp:2930

        Attachments

          Activity

            People

            • Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: