From 0f8e08d61718742e5be73e9b14e88b3bee208b05 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Mon, 6 Sep 2010 17:29:27 +0200 Subject: [PATCH] [FIX] cron: avoid multiple cron bzr revid: chs@openerp.com-20100906152927-7xhtr8q4vqjqc26h --- bin/addons/base/ir/ir_cron.py | 34 ++++++++++++++++++---------------- bin/pooler.py | 11 +++++------ 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/bin/addons/base/ir/ir_cron.py b/bin/addons/base/ir/ir_cron.py index 905b2dc1778..33962c557c4 100644 --- a/bin/addons/base/ir/ir_cron.py +++ b/bin/addons/base/ir/ir_cron.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- ############################################################################## # -# OpenERP, Open Source Management Solution +# OpenERP, Open Source Management Solution # Copyright (C) 2004-2009 Tiny SPRL (). All Rights Reserved # $Id$ # @@ -50,7 +50,7 @@ class ir_cron(osv.osv, netsvc.Agent): 'interval_number': fields.integer('Interval Number'), 'interval_type': fields.selection( [('minutes', 'Minutes'), ('hours', 'Hours'), ('work_days','Work Days'), ('days', 'Days'),('weeks', 'Weeks'), ('months', 'Months')], 'Interval Unit'), - 'numbercall': fields.integer('Number of Calls', help='Number of time the function is called,\na negative number indicates that the function will always be called'), + 'numbercall': fields.integer('Number of Calls', help='Number of time the function is called,\na negative number indicates that the function will always be called'), 'doall' : fields.boolean('Repeat Missed'), 'nextcall' : fields.datetime('Next Call Date', required=True), 'model': fields.char('Object', size=64), @@ -77,7 +77,7 @@ class ir_cron(osv.osv, netsvc.Agent): except: return False return True - + _constraints = [ (_check_args, 'Invalid arguments', ['args']), ] @@ -98,7 +98,7 @@ class ir_cron(osv.osv, netsvc.Agent): try: db, pool = pooler.get_db_and_pool(db_name) except: - return False + return False cr = db.cursor() try: if not pool._init: @@ -107,7 +107,7 @@ class ir_cron(osv.osv, netsvc.Agent): for job in cr.dictfetchall(): nextcall = datetime.strptime(job['nextcall'], '%Y-%m-%d %H:%M:%S') numbercall = job['numbercall'] - + ok = False while nextcall < now and numbercall: if numbercall > 0: @@ -125,12 +125,12 @@ class ir_cron(osv.osv, netsvc.Agent): cr.execute('select min(nextcall) as min_next_call from ir_cron where numbercall<>0 and active and nextcall>=now()') - next_call = cr.dictfetchone()['min_next_call'] + next_call = cr.dictfetchone()['min_next_call'] if next_call: next_call = time.mktime(time.strptime(next_call, '%Y-%m-%d %H:%M:%S')) else: next_call = int(time.time()) + 3600 # if do not find active cron job from database, it will run again after 1 day - + if not check: self.setAlarm(self._poolJobs, next_call, db_name, db_name) @@ -138,29 +138,31 @@ class ir_cron(osv.osv, netsvc.Agent): logger = netsvc.Logger() logger.notifyChannel('cron', netsvc.LOG_WARNING, 'Exception in cron:'+str(ex)) - + finally: cr.commit() cr.close() - + def restart(self, dbname): + self.cancel(dbname) + self._poolJobs(dbname) + def create(self, cr, uid, vals, context=None): - res = super(ir_cron, self).create(cr, uid, vals, context=context) + res = super(ir_cron, self).create(cr, uid, vals, context=context) cr.commit() - self.cancel(cr.dbname) - self._poolJobs(cr.dbname) + self.restart(cr.dbname) return res + def write(self, cr, user, ids, vals, context=None): res = super(ir_cron, self).write(cr, user, ids, vals, context=context) cr.commit() - self.cancel(cr.dbname) - self._poolJobs(cr.dbname) + self.restart(cr.dbname) return res + def unlink(self, cr, uid, ids, context=None): res = super(ir_cron, self).unlink(cr, uid, ids, context=context) cr.commit() - self.cancel(cr.dbname) - self._poolJobs(cr.dbname) + self.restart(cr.dbname) return res ir_cron() diff --git a/bin/pooler.py b/bin/pooler.py index d0f38836504..7a572e71e0d 100644 --- a/bin/pooler.py +++ b/bin/pooler.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- ############################################################################## -# +# # OpenERP, Open Source Management Solution # Copyright (C) 2004-2009 Tiny SPRL (). # @@ -15,7 +15,7 @@ # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . +# along with this program. If not, see . # ############################################################################## @@ -34,10 +34,10 @@ def get_db_and_pool(db_name, force_demo=False, status=None, update_module=False, import osv.osv pool = osv.osv.osv_pool() pool_dic[db_name] = pool - + try: addons.load_modules(db, force_demo, status, update_module) - except Exception, e: + except Exception: del pool_dic[db_name] raise @@ -51,13 +51,12 @@ def get_db_and_pool(db_name, force_demo=False, status=None, update_module=False, import report report.interface.register_all(db) if pooljobs: - pool.get('ir.cron')._poolJobs(db.dbname) + pool.get('ir.cron').restart(db.dbname) return db, pool def restart_pool(db_name, force_demo=False, status=None, update_module=False): if db_name in pool_dic: - pool_dic[db_name].get('ir.cron').cancel(db_name) del pool_dic[db_name] return get_db_and_pool(db_name, force_demo, status, update_module=update_module)