Note: This bug is a regression from 2.0.x behavior in mongos. There are no issues with mongod.
mongos returns the wrong value in the startingFrom field of OP_REPLY. The problem appears to be that mongos sets startingFrom to the same value as numberReturned. This causes PyMongo to assert expecting startingFrom to be 0 on the initial batch:
>>> cur = c.test.test.find() >>> cur.next() startingFrom: 100 numberReturned: 100 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "pymongo/cursor.py", line 747, in next if len(self.__data) or self._refresh(): File "pymongo/cursor.py", line 698, in _refresh self.__uuid_subtype)) File "pymongo/cursor.py", line 668, in __send_message assert response["starting_from"] == self.__retrieved
The output should look like this (and does with mongod in 2.1.1):
>>> cur = c.test.test.find() >>> cur.next() startingFrom: 0 numberReturned: 101 {u'i': 0.0, u'_id': ObjectId('4fb1a26cb59381ba9dc941c8')}
The problem appears to be in src/mongo/s/cursors.cpp. At line 136 in ShardedClientCursor::sendNextBatch we have:
_totalSent += docCount;
Then in the calling method ShardedClientCursor::sendNextBatchAndReply we have:
replyToQuery( 0, r.p(), r.m(), buffer.buf(), buffer.len(), docCount, _totalSent, hasMore ? getId() : 0 );
At that point docCount and _totalSent are the same.
- depends on
-
SERVER-6236 Provide getter methods for extracting values from OP_REPLY
- Closed
- is depended on by
-
PYTHON-354 Traceback on query on sharded replicaset: starting_from set incorrectly
- Closed