Sfoglia il codice sorgente

Added a 2 second timeout for sending error e-mails. Closes #222

Ask Solem 15 anni fa
parent
commit
f0d00abcf3
2 ha cambiato i file con 26 aggiunte e 7 eliminazioni
  1. 7 5
      celery/tests/test_worker_job.py
  2. 19 2
      celery/utils/mail.py

+ 7 - 5
celery/tests/test_worker_job.py

@@ -125,15 +125,16 @@ class test_TaskRequest(unittest.TestCase):
         self.assertIn("task-frobulated", tw.eventer.sent)
 
     def test_send_email(self):
-        from celery.worker import job
-        old_mail_admins = job.mail_admins
+        from celery.loaders import current_loader
+        loader = current_loader()
+        old_mail_admins = loader.mail_admins
         old_enable_mails = mytask.send_error_emails
         mail_sent = [False]
 
         def mock_mail_admins(*args, **kwargs):
             mail_sent[0] = True
 
-        job.mail_admins = mock_mail_admins
+        loader.mail_admins = mock_mail_admins
         mytask.send_error_emails = True
         try:
             tw = TaskRequest(mytask.name, gen_unique_id(), [1], {"f": "x"})
@@ -151,7 +152,7 @@ class test_TaskRequest(unittest.TestCase):
             self.assertFalse(mail_sent[0])
 
         finally:
-            job.mail_admins = old_mail_admins
+            loader.mail_admins = old_mail_admins
             mytask.send_error_emails = old_enable_mails
 
     def test_already_revoked(self):
@@ -322,7 +323,8 @@ class test_TaskRequest(unittest.TestCase):
         tw = TaskRequest(mytask.name, gen_unique_id(), [], {})
         x = tw.success_msg % {"name": tw.task_name,
                               "id": tw.task_id,
-                              "return_value": 10}
+                              "return_value": 10,
+                              "runtime": 0.3641}
         self.assertTrue(x)
         x = tw.error_msg % {"name": tw.task_name,
                            "id": tw.task_id,

+ 19 - 2
celery/utils/mail.py

@@ -1,3 +1,4 @@
+import sys
 import smtplib
 import warnings
 
@@ -6,6 +7,8 @@ try:
 except ImportError:
     from email.MIMEText import MIMEText
 
+supports_timeout = sys.version_info > (2, 5)
+
 
 class SendmailWarning(UserWarning):
     """Problem happened while sending the e-mail message."""
@@ -34,14 +37,28 @@ class Message(object):
 
 class Mailer(object):
 
-    def __init__(self, host="localhost", port=0, user=None, password=None):
+    def __init__(self, host="localhost", port=0, user=None, password=None,
+            timeout=2):
         self.host = host
         self.port = port
         self.user = user
         self.password = password
+        self.timeout = timeout
 
     def send(self, message):
-        client = smtplib.SMTP(self.host, self.port)
+        if supports_timeout:
+            self._send(message, timeout=self.timeout)
+        else:
+            import socket
+            old_timeout = socket.getdefaulttimeout()
+            socket.setdefaulttimeout(self.timeout)
+            try:
+                self._send(message)
+            finally:
+                socket.setdefaulttimeout(old_timeout)
+
+    def _send(self, message, **kwargs):
+        client = smtplib.SMTP(self.host, self.port, **kwargs)
 
         if self.user and self.password:
             client.login(self.user, self.password)