summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--openerp/addons/base/ir/ir_cron.py11
1 files changed, 10 insertions, 1 deletions
diff --git a/openerp/addons/base/ir/ir_cron.py b/openerp/addons/base/ir/ir_cron.py
index 60a69cd6b38..e5a5e5f024b 100644
--- a/openerp/addons/base/ir/ir_cron.py
+++ b/openerp/addons/base/ir/ir_cron.py
@@ -225,12 +225,21 @@ class ir_cron(osv.osv):
lock_cr = db.cursor()
try:
# Try to grab an exclusive lock on the job row from within the task transaction
+ # Restrict to the same conditions as for the search since the job may have already
+ # been run by an other thread when cron is running in multi thread
lock_cr.execute("""SELECT *
FROM ir_cron
- WHERE id=%s
+ WHERE numbercall != 0
+ AND active
+ AND nextcall <= (now() at time zone 'UTC')
+ AND id=%s
FOR UPDATE NOWAIT""",
(job['id'],), log_exceptions=False)
+ locked_job = lock_cr.fetchone()
+ if not locked_job:
+ # job was already executed by another parallel process/thread, skipping it.
+ continue
# Got the lock on the job row, run its code
_logger.debug('Starting job `%s`.', job['name'])
job_cr = db.cursor()