-1

MongoDB の質問:

mongo (バージョン: 2.1.1-pre-) に対して pymongo 2.2 を実行して、シャードされたレプリカセットを使用しています。クエリが複数の結果ドキュメントを返すと、トレースバックが発生します。

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

dlist とは何かを示すコードは、単純な find() です。reIndex() を試してみましたが、楽しくありません。私はmongoサーバーを停止して起動しようとしましたが、喜びはありません。

これは私にとって簡単に再現できます。何か案は?

4

2 に答える 2

0

わかりました、これを少し追跡しました。このアサーションエラーの解決策があります。

Mongo にはバグがあります。 シャードされたレプリカセットを照会すると、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」は、Mongo からの応答をデコードする helpers.py から取得されます。

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

つまり、Mongo の応答の 12 バイト目から 15 バイト目です。

于 2012-05-14T14:22:56.760 に答える
0

これは、mongos の 2.1.1 開発リリースのバグです。https://jira.mongodb.org/browse/SERVER-5844を参照してください。

于 2012-05-15T01:12:54.623 に答える