findAndModify queries throw an exception if all of the following conditions are met:
- the query parameter doesn't match an existing object in the collection
- new is set to true
- upsert is set to true
- a sort is provided
- authentication must be enabled on the server (can't reproduce when auth is disabled)
Other notes:
- Indexing has no effect on the ability to reproduce the bug.
- The sort's content does not impact reproductibility. It can be empty and the issue will still occur.
- The document is correctly inserted in the collection despite the exception.
- Doing a 2nd identical findAndModify query doesn't create the exception.
- The issue doesn't occur on mongo 2.0.7
Error:
The shell outputs the following when the exception occurs :
"lastErrorObject" : { "errmsg" : "need to login", "ok" : 0 }, "errmsg" : "exception: assertion src/mongo/db/../bson/bsonobjbuilder.h:131", "code" : 0, "ok" : 0
The stack trace is as follow (along with a couple of lines prior/after for context):
Tue Nov 13 18:46:37 [conn3] run command test.$cmd { findandmodify: "testCollection", query: { foo: "bar" }, update: { $set: { bob: "john" } }, sort: { foo: 1.0 }, upsert: true, new: true } Tue Nov 13 18:46:37 [conn3] query test.testCollection query: { query: { foo: "bar" }, orderby: { foo: 1.0 } } ntoreturn:1 scanAndOrder:1 keyUpdates:0 nreturned:0 reslen:20 0ms Tue Nov 13 18:46:37 [conn3] update test.testCollection query: { foo: "bar" } update: { $set: { bob: "john" } } nscanned:1 nupdated:1 fastmodinsert:1 keyUpdates:0 13ms Tue Nov 13 18:46:37 [conn3] run command admin.$cmd { getlasterror: 1 } Tue Nov 13 18:46:37 [conn3] command admin.$cmd command: { getlasterror: 1 } ntoreturn:1 keyUpdates:0 reslen:63 0ms Tue Nov 13 18:46:37 [conn3] test Assertion failure !e.eoo() src/mongo/db/../bson/bsonobjbuilder.h 131 0x1047c7c0b 0x1047a5c8c 0x104466f47 0x104519cfd 0x10454b89b 0x10454c91b 0x10454d004 0x10460acae 0x10460b43c 0x1045c0b25 0x10445bb02 0x1047be23d 0x1047f92c5 0x7fff8ef0a742 0x7fff8eef7181 0 mongod 0x00000001047c7c0b _ZN5mongo15printStackTraceERSo + 43 1 mongod 0x00000001047a5c8c _ZN5mongo12verifyFailedEPKcS1_j + 284 2 mongod 0x0000000104466f47 _ZN5mongo14BSONObjBuilder8appendAsERKNS_11BSONElementERKNS_10StringDataE + 375 3 mongod 0x0000000104519cfd _ZN5mongo16CmdFindAndModify3runERKSsRNS_7BSONObjEiRSsRNS_14BSONObjBuilderEb + 2613 4 mongod 0x000000010454b89b _ZN5mongo12_execCommandEPNS_7CommandERKSsRNS_7BSONObjEiRNS_14BSONObjBuilderEb + 91 5 mongod 0x000000010454c91b _ZN5mongo11execCommandEPNS_7CommandERNS_6ClientEiPKcRNS_7BSONObjERNS_14BSONObjBuilderEb + 2907 6 mongod 0x000000010454d004 _ZN5mongo12_runCommandsEPKcRNS_7BSONObjERNS_11_BufBuilderINS_16TrivialAllocatorEEERNS_14BSONObjBuilderEbi + 1076 7 mongod 0x000000010460acae _ZN5mongo11runCommandsEPKcRNS_7BSONObjERNS_5CurOpERNS_11_BufBuilderINS_16TrivialAllocatorEEERNS_14BSONObjBuilderEbi + 46 8 mongod 0x000000010460b43c _ZN5mongo8runQueryERNS_7MessageERNS_12QueryMessageERNS_5CurOpES1_ + 1436 9 mongod 0x00000001045c0b25 _ZN5mongo16assembleResponseERNS_7MessageERNS_10DbResponseERKNS_11HostAndPortE + 1349 10 mongod 0x000000010445bb02 _ZN5mongo16MyMessageHandler7processERNS_7MessageEPNS_21AbstractMessagingPortEPNS_9LastErrorE + 206 11 mongod 0x00000001047be23d _ZN5mongo3pms9threadRunEPNS_13MessagingPortE + 1645 12 mongod 0x00000001047f92c5 thread_proxy + 229 13 libsystem_c.dylib 0x00007fff8ef0a742 _pthread_start + 327 14 libsystem_c.dylib 0x00007fff8eef7181 thread_start + 13 Tue Nov 13 18:46:37 [conn3] command test.$cmd command: { findandmodify: "testCollection", query: { foo: "bar" }, update: { $set: { bob: "john" } }, sort: { foo: 1.0 }, upsert: true, new: true } ntoreturn:1 keyUpdates:0 locks(micros) w:15909 reslen:182 15ms