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

Arrays of certain NumberDecimals can trigger an invariant failure

    • Type: Icon: Bug Bug
    • Resolution: Fixed
    • Priority: Icon: Critical - P2 Critical - P2
    • 3.4.11, 3.6.1, 3.7.1
    • Affects Version/s: 3.4.10, 3.6.0-rc4
    • Component/s: Querying
    • Fully Compatible
    • ALL
    • v3.6, v3.4
    • Storage 2017-12-18

      This affects both 3.4 and 3.6

      Doing a query on arrays containing certain NumberDecimals can cause the following invariant failure.

      2017-11-20T17:43:06.785-0500 F -        [conn1] Invariant failure originalType == TypeBits::kDecimal && version != KeyString::Version::V0 src/mongo/db/storage/key_string.cpp 1383
      
      frame #4: 0x00000001016ec11c mongod`mongo::invariantFailed(char const*, char const*, unsigned int) + 508
      frame #5: 0x00000001012358ad mongod`mongo::(anonymous namespace)::adjustDecimalExponent(mongo::KeyString::TypeBits::Reader*, mongo::Decimal128) + 365
      frame #6: 0x00000001012339de mongod`mongo::(anonymous namespace)::toBsonValue(unsigned char, mongo::BufReader*, mongo::KeyString::TypeBits::Reader*, bool, mongo::KeyString::Version, mongo::BSONObjBuilderValueStream*) + 3918
      frame #7: 0x000000010123555d mongod`mongo::(anonymous namespace)::toBson(mongo::BufReader*, mongo::KeyString::TypeBits::Reader*, bool, mongo::KeyString::Version, mongo::BSONObjBuilder*) + 269
      frame #8: 0x000000010123339b mongod`mongo::(anonymous namespace)::toBsonValue(unsigned char, mongo::BufReader*, mongo::KeyString::TypeBits::Reader*, bool, mongo::KeyString::Version, mongo::BSONObjBuilderValueStream*) + 2315
      frame #9: 0x0000000101233224 mongod`mongo::(anonymous namespace)::toBsonValue(unsigned char, mongo::BufReader*, mongo::KeyString::TypeBits::Reader*, bool, mongo::KeyString::Version, mongo::BSONObjBuilderValueStream*) + 1940
      frame #10: 0x000000010123555d mongod`mongo::(anonymous namespace)::toBson(mongo::BufReader*, mongo::KeyString::TypeBits::Reader*, bool, mongo::KeyString::Version, mongo::BSONObjBuilder*) + 269
      frame #11: 0x000000010123339b mongod`mongo::(anonymous namespace)::toBsonValue(unsigned char, mongo::BufReader*, mongo::KeyString::TypeBits::Reader*, bool, mongo::KeyString::Version, mongo::BSONObjBuilderValueStream*) + 2315
      frame #12: 0x0000000101232a12 mongod`mongo::KeyString::toBson(char const*, unsigned long, mongo::Ordering, mongo::KeyString::TypeBits const&) + 306
      frame #13: 0x00000001010ea7fd mongod`mongo::(anonymous namespace)::WiredTigerIndexCursorBase::seek(mongo::BSONObj const&, bool, mongo::SortedDataInterface::Cursor::RequestedInfo) + 205
      frame #14: 0x000000010065ce0e mongod`mongo::IndexScan::initIndexScan() + 446
      frame #15: 0x000000010065cf91 mongod`mongo::IndexScan::doWork(unsigned long*) + 97
      frame #16: 0x000000010066a95a mongod`mongo::PlanStage::work(unsigned long*) + 90
      frame #17: 0x0000000100651574 mongod`mongo::FetchStage::doWork(unsigned long*) + 404
      frame #18: 0x000000010066a95a mongod`mongo::PlanStage::work(unsigned long*) + 90
      frame #19: 0x00000001004cb97b mongod`mongo::PlanExecutor::getNextImpl(mongo::Snapshotted<mongo::BSONObj>*, mongo::RecordId*) + 1147
      frame #20: 0x00000001004cb457 mongod`mongo::PlanExecutor::getNext(mongo::BSONObj*, mongo::RecordId*) + 71
      frame #21: 0x00000001001fce25 mongod`mongo::(anonymous namespace)::FindCmd::run(mongo::OperationContext*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, mongo::BSONObj const&, mongo::BSONObjBuilder&) + 2165
      frame #22: 0x000000010126ba07 mongod`mongo::BasicCommand::enhancedRun(mongo::OperationContext*, mongo::OpMsgRequest const&, mongo::BSONObjBuilder&) + 119
      frame #23: 0x0000000101269f00 mongod`mongo::Command::publicRun(mongo::OperationContext*, mongo::OpMsgRequest const&, mongo::BSONObjBuilder&) + 32
      frame #24: 0x00000001001c28c9 mongod`mongo::(anonymous namespace)::execCommandDatabase(mongo::OperationContext*, mongo::Command*, mongo::OpMsgRequest const&, mongo::rpc::ReplyBuilderInterface*) + 5577
      frame #25: 0x00000001001bbb64 mongod`mongo::ServiceEntryPointMongod::handleRequest(mongo::OperationContext*, mongo::Message const&) + 2324
      frame #26: 0x00000001001cab69 mongod`mongo::ServiceStateMachine::_processMessage(mongo::ServiceStateMachine::ThreadGuard) + 377
      frame #27: 0x00000001001ca480 mongod`mongo::ServiceStateMachine::_runNextInGuard(mongo::ServiceStateMachine::ThreadGuard) + 160
      frame #28: 0x00000001001cc30c mongod`std::__1::__function::__func<mongo::ServiceStateMachine::_scheduleNextWithGuard(mongo::ServiceStateMachine::ThreadGuard, mongo::transport::ServiceExecutor::ScheduleFlags, mongo::ServiceStateMachine::Ownership)::$_3, std::__1::allocator<mongo::ServiceStateMachine::_scheduleNextWithGuard(mongo::ServiceStateMachine::ThreadGuard, mongo::transport::ServiceExecutor::ScheduleFlags, mongo::ServiceStateMachine::Ownership)::$_3>, void ()>::operator()() + 92
      frame #29: 0x00000001012661a0 mongod`mongo::transport::ServiceExecutorSynchronous::schedule(std::__1::function<void ()>, mongo::transport::ServiceExecutor::ScheduleFlags) + 656
      frame #30: 0x00000001001ca141 mongod`mongo::ServiceStateMachine::_scheduleNextWithGuard(mongo::ServiceStateMachine::ThreadGuard, mongo::transport::ServiceExecutor::ScheduleFlags, mongo::ServiceStateMachine::Ownership) + 177
      frame #31: 0x00000001001c9830 mongod`mongo::ServiceStateMachine::_sourceCallback(mongo::Status) + 496
      frame #32: 0x00000001001c92e5 mongod`mongo::ServiceStateMachine::_sourceMessage(mongo::ServiceStateMachine::ThreadGuard) + 197
      frame #33: 0x00000001001ca44b mongod`mongo::ServiceStateMachine::_runNextInGuard(mongo::ServiceStateMachine::ThreadGuard) + 107
      frame #34: 0x00000001001cc30c mongod`std::__1::__function::__func<mongo::ServiceStateMachine::_scheduleNextWithGuard(mongo::ServiceStateMachine::ThreadGuard, mongo::transport::ServiceExecutor::ScheduleFlags, mongo::ServiceStateMachine::Ownership)::$_3, std::__1::allocator<mongo::ServiceStateMachine::_scheduleNextWithGuard(mongo::ServiceStateMachine::ThreadGuard, mongo::transport::ServiceExecutor::ScheduleFlags, mongo::ServiceStateMachine::Ownership)::$_3>, void ()>::operator()() + 92
      frame #35: 0x0000000101266d7f mongod`std::__1::__function::__func<mongo::transport::ServiceExecutorSynchronous::schedule(std::__1::function<void ()>, mongo::transport::ServiceExecutor::ScheduleFlags)::$_0, std::__1::allocator<mongo::transport::ServiceExecutorSynchronous::schedule(std::__1::function<void ()>, mongo::transport::ServiceExecutor::ScheduleFlags)::$_0>, void ()>::operator()() + 671
      
      

      Note that it doesn't always hit the same invariant every time. A number of Decimal128 related invariants in key_string.cpp have been hit, which seems to indicate that the key string being converted is not actually a Decimal128.

            Assignee:
            geert.bosch@mongodb.com Geert Bosch
            Reporter:
            robert.guo@mongodb.com Robert Guo (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            9 Start watching this issue

              Created:
              Updated:
              Resolved: