Ich habe mehrere Daemons, die viele Dateien von Amazon S3 mit Boto lesen. Alle paar Tage stoße ich auf eine Situation, in der ein httplib.IncompleteRead aus dem Inneren von Boto geworfen wird. Wenn ich die Anfrage versuche und erneut versuche, schlägt sie sofort mit einem anderen IncompleteRead fehl. Selbst wenn ich bucket.connection.close()
anrufe, werden alle weiteren Anfragen immer noch fehlschlagen.
Ich fühle mich, als wäre ich hier über einen Bug in Boto gestolpert, aber niemand sonst scheint es getroffen zu haben. Mache ich etwas falsch? Alle Daemons sind single-threaded, und ich habe versucht, is_secure
in beide Richtungen zu setzen.
Umgebung:
Es kann durchaus ein Bug in Boto sein, aber die Symptome, die Sie beschreiben, sind nicht einzigartig. Siehe
UnvollständigLesen Sie mit httplib
Da httplib in Ihrem Traceback erscheint, wird hier eine Lösung vorgeschlagen:
Haftungsausschluss: Ich habe keine Erfahrung mit Boto. Dies basiert auf Forschung und veröffentlicht, da es keine anderen Antworten gab.
Ich habe eine Weile mit diesem Problem gekämpft und lange laufende Prozesse ausgeführt, die große Datenmengen von S3 lesen. Ich habe beschlossen, hier meine Lösung für die Nachwelt zu veröffentlichen.
Erstens bin ich mir sicher, dass der von @Glenn angesprochene Hack funktioniert, aber ich entschied mich dafür, ihn nicht zu verwenden, weil ich ihn als aufdringlich empfinde (httckib hacken) und unsicher (er gibt blind zurück, was er hat, zB return e.partial
, obwohl es sich um einen echten Fehlerfall handeln kann.
Hier ist die Lösung, die ich schließlich gefunden habe, die zu funktionieren scheint.
Ich verwende diese universelle Wiederholungsfunktion:
%Vor% Wenn ich jetzt eine Datei von S3 lese, benutze ich diese Funktion, die intern Wiederholungen im Falle von IncompleteRead
-Fehlern durchführt. Bei einem Fehler rufe ich vor dem erneuten Versuch key.close(fast = True)
.