The KeepMutationsNode query solution node is added to the incorrect place in the query solution tree for "split limited sort" plans (which are generated when a sort and a positive ntoreturn are specified). As a consequence, if the documents to be returned are concurrently updated, the KeepMutationsStage can inject these documents into the result stream out of order.
Affects versions released since 2.5.5.
Reproduce with the following:
db.foo.drop(); for (var i = 0; i < 6; ++i) { db.foo.insert({a: 1, b: i, c: 1}); } assert.commandWorked(db.adminCommand({setParameter: 1, internalQueryExecYieldIterations: 1})); db.foo.ensureIndex({a: 1}); startParallelShell("for (;;) { db.foo.update({}, {$inc: {c: 1}}, {multi: true}); }"); for (;;) { var results = db.foo.find({a: 1}).sort({b: 1}).batchSize(2).toArray(); var resultsSorted = results.concat().sort(function(lhs, rhs) { return lhs.b - rhs.b; }); assert.eq(results, resultsSorted); }
Output generated:
assert: [[ { "_id" : ObjectId("55d2789ecce4f5bfbe04948f"), "a" : 1, "b" : 0, "c" : 3 }, { "_id" : ObjectId("55d2789ecce4f5bfbe049490"), "a" : 1, "b" : 1, "c" : 3 }, { "_id" : ObjectId("55d2789ecce4f5bfbe04948f"), "a" : 1, "b" : 0, "c" : 3 }, { "_id" : ObjectId("55d2789ecce4f5bfbe049490"), "a" : 1, "b" : 1, "c" : 3 }, { "_id" : ObjectId("55d2789ecce4f5bfbe049491"), "a" : 1, "b" : 2, "c" : 3 }, { "_id" : ObjectId("55d2789ecce4f5bfbe049492"), "a" : 1, "b" : 3, "c" : 3 }, { "_id" : ObjectId("55d2789ecce4f5bfbe049493"), "a" : 1, "b" : 4, "c" : 3 }, { "_id" : ObjectId("55d2789ecce4f5bfbe049494"), "a" : 1, "b" : 5, "c" : 3 } ]] != [[ { "_id" : ObjectId("55d2789ecce4f5bfbe04948f"), "a" : 1, "b" : 0, "c" : 3 }, { "_id" : ObjectId("55d2789ecce4f5bfbe04948f"), "a" : 1, "b" : 0, "c" : 3 }, { "_id" : ObjectId("55d2789ecce4f5bfbe049490"), "a" : 1, "b" : 1, "c" : 3 }, { "_id" : ObjectId("55d2789ecce4f5bfbe049490"), "a" : 1, "b" : 1, "c" : 3 }, { "_id" : ObjectId("55d2789ecce4f5bfbe049491"), "a" : 1, "b" : 2, "c" : 3 }, { "_id" : ObjectId("55d2789ecce4f5bfbe049492"), "a" : 1, "b" : 3, "c" : 3 }, { "_id" : ObjectId("55d2789ecce4f5bfbe049493"), "a" : 1, "b" : 4, "c" : 3 }, { "_id" : ObjectId("55d2789ecce4f5bfbe049494"), "a" : 1, "b" : 5, "c" : 3 } ]] are not equal : undefined
- related to
-
SERVER-17011 Cursor can return objects out of order if updated during query ("legacy" readMode only)
- Closed