summaryrefslogtreecommitdiff
path: root/odoo/addons/base/models
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2017-12-06 12:02:58 +0100
committerChristophe Simonis <chs@odoo.com>2017-12-06 12:02:58 +0100
commit8ef7af6afe54fbd59051bbbce76daadd6fdb0e86 (patch)
treeb21971e972eacc87e198fbc38b48ac9b70d168fc /odoo/addons/base/models
parent010add290342ae1e2887450a381e0d1f0acd34e5 (diff)
parentf96a797fe6238306ec70d3db013b8a4d348ef181 (diff)
[MERGE] forward port branch 11.0 up to f96a797fe62
Diffstat (limited to 'odoo/addons/base/models')
-rw-r--r--odoo/addons/base/models/ir_cron.py18
-rw-r--r--odoo/addons/base/models/ir_mail_server.py2
2 files changed, 17 insertions, 3 deletions
diff --git a/odoo/addons/base/models/ir_cron.py b/odoo/addons/base/models/ir_cron.py
index 2aa7a1e2773..375d9a966da 100644
--- a/odoo/addons/base/models/ir_cron.py
+++ b/odoo/addons/base/models/ir_cron.py
@@ -5,7 +5,7 @@ import threading
import time
import psycopg2
import pytz
-from datetime import datetime
+from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
import odoo
@@ -15,6 +15,7 @@ from odoo.exceptions import UserError
_logger = logging.getLogger(__name__)
BASE_VERSION = odoo.modules.load_information_from_description_file('base')['version']
+MAX_FAIL_TIME = timedelta(hours=5) # chosen with a fair roll of the dice
class BadVersion(Exception):
@@ -170,7 +171,7 @@ class ir_cron(models.Model):
(version,) = cr.fetchone()
cr.execute("SELECT COUNT(*) FROM ir_module_module WHERE state LIKE %s", ['to %'])
(changes,) = cr.fetchone()
- if not version or changes:
+ if version is None:
raise BadModuleState()
elif version != BASE_VERSION:
raise BadVersion()
@@ -181,6 +182,19 @@ class ir_cron(models.Model):
ORDER BY priority""")
jobs = cr.dictfetchall()
+ if changes:
+ if not jobs:
+ raise BadModuleState()
+ # nextcall is never updated if the cron is not executed,
+ # it is used as a sentinel value to check whether cron jobs
+ # have been locked for a long time (stuck)
+ parse = fields.Datetime.from_string
+ oldest = min([parse(job['nextcall']) for job in jobs])
+ if datetime.now() - oldest > MAX_FAIL_TIME:
+ odoo.modules.reset_modules_state(db_name)
+ else:
+ raise BadModuleState()
+
for job in jobs:
lock_cr = db.cursor()
try:
diff --git a/odoo/addons/base/models/ir_mail_server.py b/odoo/addons/base/models/ir_mail_server.py
index 639d411045b..0a08993d639 100644
--- a/odoo/addons/base/models/ir_mail_server.py
+++ b/odoo/addons/base/models/ir_mail_server.py
@@ -61,7 +61,7 @@ def encode_header(header_text):
header_text = ustr(header_text) # FIXME: require unicode higher up?
if is_ascii(header_text):
return pycompat.to_native(header_text)
- Header(header_text, 'utf-8')
+ return Header(header_text, 'utf-8')
def encode_header_param(param_text):
"""Returns an appropriate RFC2047 encoded representation of the given