[SERVER-19906] verify() failure when text index on "_fts" has weights set to empty object Created: 12/Aug/15  Updated: 27/Oct/15  Resolved: 15/Oct/15

Status: Closed
Project: Core Server
Component/s: Index Maintenance, Text Search
Affects Version/s: 2.6.11, 3.0.5, 3.1.6
Fix Version/s: 3.2.0-rc1

Type: Bug Priority: Major - P3
Reporter: J Delaney Assignee: Mark Benvenuto
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Backwards Compatibility: Fully Compatible
Operating System: ALL
Steps To Reproduce:

db.foo.drop();
db.foo.ensureIndex({
    _fts: 'text',
    _ftsx: 1
}, { weights: {}})

Sprint: Platform A (10/09/15), Platform B (10/30/15)
Participants:

 Description   

Assertion failure _wildcard || _weights.size() src/mongo/db/fts/fts_spec.cpp 13

Does not cause verify() failure when weights is specified or weights is undefined.

Backtrace:

  thread #14: tid = 0xbe6e88, 0x00007fff8d39adee libsystem_c.dylib`__sfvwrite + 867
    frame #0: 0x00007fff8d39adee libsystem_c.dylib`__sfvwrite + 867
    frame #1: 0x00007fff8d39b0ab libsystem_c.dylib`fwrite + 142
    frame #2: 0x00007fff8e1b0d2a libc++.1.dylib`std::__1::__stdoutbuf<char>::overflow(int) + 82
    frame #3: 0x00007fff8e1a691d libc++.1.dylib`std::__1::basic_streambuf<char, std::__1::char_traits<char> >::xsputn(char const*, long) + 73
    frame #4: 0x00007fff8e1ad94c libc++.1.dylib`std::__1::basic_ostream<char, std::__1::char_traits<char> >::write(char const*, long) + 72
    frame #5: 0x00000001000503b5 mongod`mongo::operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, mongo::StringData)(stream=0x00007fff7b99a2f8, value=(_data = "\n\n***aborting after verify() failure as this is a debug/test build\n\n\n", _size = 69)) + 69 at string_data.cpp:57
    frame #6: 0x0000000100fd25f5 mongod`mongo::logger::MessageEventDetailsEncoder::encode(this=0x0000000104927ae0, event=0x000000010a7bf0b0, os=0x00007fff7b99a2f8) + 709 at message_event_utf8_encoder.cpp:77
    frame #7: 0x0000000100716196 mongod`mongo::logger::ConsoleAppender<mongo::logger::MessageEventEphemeral, mongo::Console>::append(this=0x000000010492cd50, event=0x000000010a7bf0b0) + 198 at console_appender.h:53
    frame #8: 0x0000000100fd316e mongod`mongo::logger::LogDomain<mongo::logger::MessageEventEphemeral>::append(this=0x0000000104928238, event=0x000000010a7bf0b0) + 574 at log_domain-impl.h:59
    frame #9: 0x0000000100fcf36f mongod`mongo::logger::LogstreamBuilder::~LogstreamBuilder(this=0x000000010a7bf648) + 1359 at logstream_builder.cpp:126
    frame #10: 0x0000000100fcfd25 mongod`mongo::logger::LogstreamBuilder::~LogstreamBuilder(this=0x000000010a7bf648) + 21 at logstream_builder.cpp:119
    frame #11: 0x0000000101326b10 mongod`mongo::verifyFailed(expr=0x00000001023e67fd, file=0x00000001023e67be, line=131) + 1872 at assert_util.cpp:143
    frame #12: 0x0000000100620c19 mongod`mongo::fts::FTSSpec::FTSSpec(this=0x0000000104930f50, indexInfo=0x0000000104932b48) + 3817 at fts_spec.cpp:131
    frame #13: 0x000000010062166d mongod`mongo::fts::FTSSpec::FTSSpec(this=0x0000000104930f50, indexInfo=0x0000000104932b48) + 29 at fts_spec.cpp:155
    frame #14: 0x00000001006c846a mongod`mongo::FTSAccessMethod::FTSAccessMethod(this=0x0000000104930f30, btreeState=0x000000010492ebc0, btree=0x0000000104930ed0) + 122 at fts_access_method.cpp:35
    frame #15: 0x00000001006c84c5 mongod`mongo::FTSAccessMethod::FTSAccessMethod(this=0x0000000104930f30, btreeState=0x000000010492ebc0, btree=0x0000000104930ed0) + 37 at fts_access_method.cpp:35
    frame #16: 0x0000000100e0c7d4 mongod`mongo::KVDatabaseCatalogEntry::getIndex(this=0x000000010492bb70, txn=0x000000010a7c5318, collection=0x0000000104930960, index=0x000000010492ebc0) + 5300 at kv_database_catalog_entry_get_index.cpp:74
    frame #17: 0x000000010030f97d mongod`mongo::IndexCatalog::_setupInMemoryStructures(this=0x0000000104930ad8, txn=0x000000010a7c5318, descriptor=0x0000000104932b20, initFromDisk=false) + 909 at index_catalog.cpp:167
    frame #18: 0x000000010031692c mongod`mongo::IndexCatalog::IndexBuildBlock::init(this=0x00000001049301c0) + 1116 at index_catalog.cpp:382
    frame #19: 0x0000000100325539 mongod`mongo::MultiIndexBlock::init(this=0x000000010a7c28b0, indexSpecs=0x000000010a7c2c90) + 2617 at index_create.cpp:178
    frame #20: 0x0000000100372984 mongod`mongo::CmdCreateIndex::run(this=0x00000001026ad690, txn=0x000000010a7c5318, dbname=0x000000010a7c32b8, cmdObj=0x000000010a7c32e8, options=0, errmsg=0x000000010a7c32d0, result=0x000000010a7c3400) + 7364 at create_indexes.cpp:213
    frame #21: 0x00000001004a77ce mongod`mongo::Command::run(this=0x00000001026ad690, txn=0x000000010a7c5318, request=0x000000010a7c3fb0, replyBuilder=0x000000010a7c4030) + 2974 at dbcommands.cpp:1336
    frame #22: 0x00000001004a68ab mongod`mongo::Command::execCommand(txn=0x000000010a7c5318, command=0x00000001026ad690, request=0x000000010a7c3fb0, replyBuilder=0x000000010a7c4030) + 3915 at dbcommands.cpp:1260
    frame #23: 0x000000010034e9f8 mongod`mongo::runCommands(txn=0x000000010a7c5318, request=0x000000010a7c3fb0, replyBuilder=0x000000010a7c4030) + 2056 at commands.cpp:495
    frame #24: 0x000000010071bfd9 mongod`mongo::(anonymous namespace)::receivedRpc(txn=0x000000010a7c5318, client=0x000000010492ca50, dbResponse=0x000000010a7c5390, message=0x000000010a7c5b90) + 633 at instance.cpp:290
    frame #25: 0x0000000100718989 mongod`mongo::assembleResponse(txn=0x000000010a7c5318, m=0x000000010a7c5b90, dbresponse=0x000000010a7c5390, remote=0x000000010a7c52f8) + 2441 at instance.cpp:508
    frame #26: 0x00000001000191e3 mongod`mongo::MyMessageHandler::process(this=0x0000000104d11c40, m=0x000000010a7c5b90, port=0x0000000104d15060) + 307 at db.cpp:165
    frame #27: 0x000000010136a827 mongod`mongo::PortMessageServer::handleIncomingMsg(arg=0x0000000104d15060) + 2983 at message_server_port.cpp:229
    frame #28: 0x0000000101368baa mongod`void* std::__1::__thread_proxy<std::__1::tuple<std::__1::__bind<void* (*)(void*), mongo::(anonymous namespace)::MessagingPortWithHandler*> > >(void*) [inlined] decltype(__f=0x0000000104d14470, __args=0x0000000104d14478)(void*)>(fp)(std::__1::forward<mongo::(anonymous namespace)::MessagingPortWithHandler*&>(fp0))) std::__1::__invoke<void* (*&)(void*), mongo::(anonymous namespace)::MessagingPortWithHandler*&>(void* (*&&&)(void*), mongo::(anonymous namespace)::MessagingPortWithHandler*&&&) + 24 at __functional_base:413
    frame #29: 0x0000000101368b92 mongod`void* std::__1::__thread_proxy<std::__1::tuple<std::__1::__bind<void* (*)(void*), mongo::(anonymous namespace)::MessagingPortWithHandler*> > >(void*) [inlined] std::__1::__bind_return<void* (*)(void*), std::__1::tuple<mongo::(anonymous namespace)::MessagingPortWithHandler*>, std::__1::tuple<>, _is_valid_bind_return<void* (*)(void*), std::__1::tuple<mongo::(anonymous namespace)::MessagingPortWithHandler*>, std::__1::tuple<> >::value>::type std::__1::__apply_functor<void* (__f=0x0000000104d14470, __bound_args=0x0000000104d14478, (null)=__tuple_indices<0> at 0x000000010a7c5ea0, __args=0x000000010a7c5e60)(void*), std::__1::tuple<mongo::(anonymous namespace)::MessagingPortWithHandler*>, 0ul, std::__1::tuple<> >(void* (*&)(void*), std::__1::tuple<mongo::(anonymous namespace)::MessagingPortWithHandler*>&, std::__1::__tuple_indices<0ul>, std::__1::tuple<>&&) + 40 at functional:2023
    frame #30: 0x0000000101368b6a mongod`void* std::__1::__thread_proxy<std::__1::tuple<std::__1::__bind<void* (*)(void*), mongo::(anonymous namespace)::MessagingPortWithHandler*> > >(void*) [inlined] std::__1::__bind_return<void* (*)(void*), std::__1::tuple<mongo::(anonymous namespace)::MessagingPortWithHandler*>, std::__1::tuple<>, _is_valid_bind_return<void* (*)(void*), std::__1::tuple<mongo::(anonymous namespace)::MessagingPortWithHandler*>, std::__1::tuple<> >::value>::type std::__1::__bind<void* (this=0x0000000104d14470)(void*), mongo::(anonymous namespace)::MessagingPortWithHandler*>::operator()<>() + 38 at functional:2086
    frame #31: 0x0000000101368b44 mongod`void* std::__1::__thread_proxy<std::__1::tuple<std::__1::__bind<void* (*)(void*), mongo::(anonymous namespace)::MessagingPortWithHandler*> > >(void*) [inlined] decltype(__f=0x0000000104d14470)(void*), mongo::(anonymous namespace)::MessagingPortWithHandler*> >(fp)(std::__1::forward<>(fp0))) std::__1::__invoke<std::__1::__bind<void* (*)(void*), mongo::(anonymous namespace)::MessagingPortWithHandler*> >(std::__1::__bind<void* (*)(void*), mongo::(anonymous namespace)::MessagingPortWithHandler*>&&) + 11 at __functional_base:413
    frame #32: 0x0000000101368b39 mongod`void* std::__1::__thread_proxy<std::__1::tuple<std::__1::__bind<void* (*)(void*), mongo::(anonymous namespace)::MessagingPortWithHandler*> > >(void*) [inlined] void std::__1::__thread_execute<std::__1::__bind<void* (*)(void*), mongo::(anonymous namespace)::MessagingPortWithHandler*> >(__t=0x0000000104d14470, (null)=__tuple_indices<> at 0x000000010a7c5e38)(void*), mongo::(anonymous namespace)::MessagingPortWithHandler*> >&, std::__1::__tuple_indices<>) + 25 at thread:332
    frame #33: 0x0000000101368b20 mongod`void* std::__1::__thread_proxy<std::__1::tuple<std::__1::__bind<void* (*)(void*), mongo::(anonymous namespace)::MessagingPortWithHandler*> > >(__vp=0x0000000104d14470) + 368 at thread:342
    frame #34: 0x00007fff9496b268 libsystem_pthread.dylib`_pthread_body + 131
    frame #35: 0x00007fff9496b1e5 libsystem_pthread.dylib`_pthread_start + 176
    frame #36: 0x00007fff9496941d libsystem_pthread.dylib`thread_start + 13



 Comments   
Comment by Githook User [ 15/Oct/15 ]

Author:

{u'username': u'markbenvenuto', u'name': u'Mark Benvenuto', u'email': u'mark.benvenuto@mongodb.com'}

Message: SERVER-19906: verify() failure when text index on "_fts" has weights set to empty object
Branch: master
https://github.com/mongodb/mongo/commit/20e2bf0b7c57268877b8ab23ad29b3f57af624ff

Comment by J Rassi [ 07/Oct/15 ]

I'd recommend ignoring "weights" if it is empty.

For a user index spec object, "weights" is intended to allow users to specify weights for a subset of paths mentioned in the index key; the paths not mentioned in "weights" will be given the default weight. Since the empty subset is a valid subset, it seems reasonable to me to accept it.

Comment by Mark Benvenuto [ 07/Oct/15 ]

jason.rassi In ensureIndex for full-text index, do you have an opinion on whether we should allow the optional weights field to be an empty object? For instance, should we throw an error or ignore it? Simply ignoring would seem to be consistent with our existing lax validation.

Generated at Thu Feb 08 03:52:26 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.