Bläddra i källkod

Beat: PersistentScheduler: Automatically remove corrupted db. Closes #346. Thanks to stipa

Ask Solem 14 år sedan
förälder
incheckning
e5252c1bec
1 ändrade filer med 22 tillägg och 2 borttagningar
  1. 22 2
      celery/beat.py

+ 22 - 2
celery/beat.py

@@ -3,6 +3,8 @@
 Periodic Task Scheduler
 Periodic Task Scheduler
 
 
 """
 """
+import errno
+import os
 import time
 import time
 import shelve
 import shelve
 import sys
 import sys
@@ -298,9 +300,27 @@ class PersistentScheduler(Scheduler):
         self.schedule_filename = kwargs.get("schedule_filename")
         self.schedule_filename = kwargs.get("schedule_filename")
         Scheduler.__init__(self, *args, **kwargs)
         Scheduler.__init__(self, *args, **kwargs)
 
 
+    def _remove_db(self):
+        for suffix in "", ".db", ".dat":
+            try:
+                os.remove(self.schedule_filename + suffix)
+            except OSError, exc:
+                if exc.errno != errno.ENOENT:
+                    raise
+            else:
+                break
+
     def setup_schedule(self):
     def setup_schedule(self):
-        self._store = self.persistence.open(self.schedule_filename,
-                                            writeback=True)
+        try:
+            self._store = self.persistence.open(self.schedule_filename,
+                                                writeback=True)
+        except Exception, exc:
+            self.logger.error("Removing corrupted schedule file %r: %r" % (
+                self.schedule_filename, exc))
+            self._remove_db()
+            self._store = self.persistence.open(self.schedule_filename,
+                                                writeback=True)
+
         if "__version__" not in self._store:
         if "__version__" not in self._store:
             self._store.clear()   # remove schedule at 2.2.2 upgrade.
             self._store.clear()   # remove schedule at 2.2.2 upgrade.
         entries = self._store.setdefault("entries", {})
         entries = self._store.setdefault("entries", {})