-1

MongoDB Question:

We're using a sharded replicaset, running pymongo 2.2 against mongo (version: 2.1.1-pre-). We're getting a traceback when a query returns more than one result document.

Traceback (most recent call last):
File "/usr/lib64/python2.6/threading.py", line 532, in __bootstrap_inner
  self.run()
File "/opt/DCM/mods/plugin.py", line 25, in run
  self._mod.collect_metrics_dcm()
File "/opt/DCM/plugins/res.py", line 115, in collect_metrics_dcm
  ms.updateSpecificMetric(metricName, value, timestamp)
File "/opt/DCM/mods/mongoSaver.py", line 155, in updateSpecificMetric
  latestDoc = self.getLatestDoc(metricName)
File "/opt/DCM/mods/mongoSaver.py", line 70, in getLatestDoc
  for d in dlist:
File "/usr/lib64/python2.6/site-packages/pymongo/cursor.py", line 747, in next
  if len(self.__data) or self._refresh():
File "/usr/lib64/python2.6/site-packages/pymongo/cursor.py", line 698, in _refresh
  self.__uuid_subtype))
File "/usr/lib64/python2.6/site-packages/pymongo/cursor.py", line 668, in __send_message
  assert response["starting_from"] == self.__retrieved
AssertionError

The code that give what dlist is is a simple find(). I've tried reIndex(), no joy. I've tried stopping and starting the mongo server, no joy.

This is easily replicable for me. Any ideas?

4

2 回答 2

0

这是 mongos 2.1.1 开发版本中的一个错误。见https://jira.mongodb.org/browse/SERVER-5844

于 2012-05-15T01:12:54.623 回答
0

好的,所以稍微追踪了一下,我有一个解决这个断言错误的方法。

Mongo中有一个BUG。 查询分片副本集时,Mongo 返回的“starting_from”值不正确。它不是在第一个查询中返回 0,而是返回接收到的记录数而不是偏移值。我有一个 pymongo 补丁来防止这种不良信息:

文件是 site-packages/pymongo/cursor.py。

[user@hostname]$ diff cursor.py.orig cursor.py
631,632c631,634
<         if not self.__tailable:
<             assert response["starting_from"] == self.__retrieved
---
>   if ((not self.__tailable) and (self.__retrieved != 0) and (response["starting_from"] != self.__retrieved)):
>             from pprint import pformat
>             msg = "Server response of 'starting_from' is '%s', but self__retrieved (which is only set to nonzero below here) is '%s'." % (pformat(response), pformat(self.__retrieved))
>             assert False, msg

'starting_from' 来自 helpers.py 解码来自 Mongo 的响应:

result["starting_from"] = struct.unpack("<i", response[12:16])[0]

所以,这是 Mongo 响应的第 12 到第 15 个字节。

于 2012-05-14T14:22:56.760 回答