2012-03-25 8 views
5

Ich habe eine Funktion, die Daten von einer Website liest, verarbeitet und dann in MongoDB lädt. Wenn ich das ohne Threading ausführe, funktioniert es gut, aber sobald ich Sellerie-Aufgaben aufstelle, die nur diese eine Funktion aufrufen, bekomme ich häufig den folgenden Fehler: "OperationFailure: Datenbankfehler: unauthorized db: dbname lock type: -1"OperationFailure: Datenbankfehler beim Einfädeln in MongoEngine/PyMongo

Es ist etwas seltsam, denn wenn ich die Nicht-Sellerie-Version auf mehreren Terminals laufen lasse, bekomme ich diesen Fehler überhaupt nicht.

Ich vermute, dass es etwas damit zu tun hat, dass es keine offene Verbindung zu Mongo gibt, obwohl ich in meinem Code direkt vor jedem Mongo-Aufruf einen öffne.

Die genaue Ausnahme ist unten:

Task twitter[a974bfcc-d6ca-4baf-b36f-cae9143ce2d9] raised exception: OperationFailure(u'database error: unauthorized db:data lock type:-1 client:68.193.49.9',) 
Traceback (most recent call last): 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/celery/execute/trace.py", line 36, in trace 
    return cls(states.SUCCESS, retval=fun(*args, **kwargs)) 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/celery/app/task/__init__.py", line 232, in __call__ 
    return self.run(*args, **kwargs) 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/celery/app/__init__.py", line 172, in run 
    return fun(*args, **kwargs) 
File "/djangoblog/network/tasks.py", line 40, in twitter 
    n_twitter.GetTweetsTwitter(user) 
File "/djangoblog/network/twitter.py", line 255, in GetTweetsTwitter 
    id = SaveTweet(user, network, tweet) 
File "/djangoblog/network/twitter.py", line 150, in SaveTweet 
    if mmo.Moment.objects(user=user.id,source_id=id,network=network.id).count() == 0: 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/mongoengine/queryset.py", line 933, in count 
    return self._cursor.count(with_limit_and_skip=True) 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/mongoengine/queryset.py", line 563, in _cursor 
    self._cursor_obj = self._collection.find(self._query, 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/mongoengine/queryset.py", line 493, in _collection 
    if self._collection_obj.name not in db.collection_names(): 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/pymongo/database.py", line 361, in collection_names 
    names = [r["name"] for r in results] 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/pymongo/cursor.py", line 703, in next 
    if len(self.__data) or self._refresh(): 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/pymongo/cursor.py", line 666, in _refresh 
    self.__uuid_subtype)) 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/pymongo/cursor.py", line 628, in __send_message self.__tz_aware) 
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/pymongo/helpers.py", line 101, in _unpack_response error_object["$err"]) 
OperationFailure: database error: unauthorized db:data lock type:-1 client:68.193.49.9 

Sorry für die Formatierung, aber wenn man sich die Linie suchen, die mit mmo.Moment beginnt es eine Verbindung direkt geöffnet werden, bevor das genannt wird.

ein wenig Forschung tut es aussieht, als ob es etwas mit der Art und Weise Einfädeln in PyMongo gehandhabt zu tun hat - http://api.mongodb.org/python/1.5.1/faq.html#how-does-connection-pooling-work-in-pymongo - ich brauche, um die Verbindungen beginnen kann zu schließen, aber ich würde erwarten MongoEngine dies zu tun ..

+1

Ich glaube nicht, dass ich Ihnen helfen kann, aber wenn Sie den vollen Stack-Trace veröffentlichen, ist es wahrscheinlicher, dass jemand anderer Ihnen helfen kann. –

+0

@DavidWolever - macht Sinn. Ich habe gerade meine Frage aktualisiert. –

Antwort

2

Dies liegt wahrscheinlich daran, dass Sie db.authenticate() nicht aufrufen, wenn Sie die neue Verbindung starten und auth in MongoDB verwenden.

In Bezug auf das Schließen von Threads würde ich empfehlen, sicherzustellen, dass Sie Verbindungspooling verwenden und den Treiber die Pools verwalten lassen (das manuelle Aufrufen von close() o.ä. kann zu erheblichen Problemen führen).

Weitere Informationen finden Sie unter the note in der Pymongo-Dokumentation zur Verwendung von authenticate() in einer Multithread-Umgebung.