diff --git a/openerp-server b/openerp-server index a2ec11ba996..56aa278940a 100755 --- a/openerp-server +++ b/openerp-server @@ -100,7 +100,7 @@ if not ( config["stop_after_init"] or \ if config['db_name']: for dbname in config['db_name'].split(','): - db, pool = openerp.pooler.get_db_and_pool(dbname, update_module=config['init'] or config['update'], pooljobs=False) + db, registry = openerp.pooler.get_db_and_pool(dbname, update_module=config['init'] or config['update'], pooljobs=False) cr = db.cursor() if config["test_file"]: @@ -109,7 +109,7 @@ if config['db_name']: cr.rollback() # jobs will start to be processed later, when start_agent below is called. - pool.get('ir.cron').restart(db.dbname) + registry.start_cron_thread() cr.close() @@ -218,6 +218,7 @@ def quit(): # and would present the forced shutdown thread.join(0.05) time.sleep(0.05) + openerp.modules.registry.RegistryManager.delete_all() sys.exit(0) if config['pidfile']: diff --git a/openerp/modules/registry.py b/openerp/modules/registry.py index 11f484a71a0..cb81284f6fa 100644 --- a/openerp/modules/registry.py +++ b/openerp/modules/registry.py @@ -25,6 +25,8 @@ import openerp.sql_db import openerp.osv.orm +import openerp.netsvc +import openerp.tools class Registry(object): @@ -82,6 +84,9 @@ class Registry(object): return res + def start_cron_thread(self): + self.get('ir.cron').restart(self.db.dbname) + class RegistryManager(object): """ Model registries manager. @@ -143,16 +148,34 @@ class RegistryManager(object): cr.close() if pooljobs: - registry.get('ir.cron').restart(registry.db.dbname) + registry.start_cron_thread() return registry @classmethod def delete(cls, db_name): - """ Delete the registry linked to a given database. """ + """ Delete the registry linked to a given database. + + This also cleans the associated caches. For good measure this also + cancels the associated cron job. But please note that the cron job can + be running and take some time before ending, and that you should not + remove a registry if it can still be used by some thread. So it might + be necessary to call yourself openerp.netsvc.Agent.cancel(db_name) and + and join (i.e. wait for) the thread. + + """ if db_name in cls.registries: del cls.registries[db_name] + openerp.tools.cache.clean_caches_for_db(db_name) + openerp.netsvc.Agent.cancel(db_name) + + + @classmethod + def delete_all(cls): + """ Delete all the registries. """ + for db_name in cls.registries.keys(): + cls.delete(db_name) # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/pooler.py b/openerp/pooler.py index c754385d6b3..88b60864b90 100644 --- a/openerp/pooler.py +++ b/openerp/pooler.py @@ -34,11 +34,6 @@ def get_db_and_pool(db_name, force_demo=False, status=None, update_module=False, return registry.db, registry -def delete_pool(db_name): - """Delete an existing registry.""" - RegistryManager.delete(db_name) - - def restart_pool(db_name, force_demo=False, status=None, update_module=False): """Delete an existing registry and return a database connection and a newly initialized registry.""" registry = RegistryManager.new(db_name, force_demo, status, update_module, True) diff --git a/openerp/service/web_services.py b/openerp/service/web_services.py index 40e7ccf1d69..e7757ec1e66 100644 --- a/openerp/service/web_services.py +++ b/openerp/service/web_services.py @@ -161,8 +161,8 @@ class db(netsvc.ExportService): raise Exception, e def exp_drop(self, db_name): + openerp.modules.registry.RegistryManager.delete(db_name) sql_db.close_db(db_name) - openerp.netsvc.Agent.cancel(db_name) logger = netsvc.Logger() db = sql_db.db_connect('template1') @@ -264,8 +264,8 @@ class db(netsvc.ExportService): return True def exp_rename(self, old_name, new_name): + openerp.modules.registry.RegistryManager.delete(old_name) sql_db.close_db(old_name) - openerp.netsvc.Agent.cancel(db_name) logger = netsvc.Logger() db = sql_db.db_connect('template1') diff --git a/openerp/sql_db.py b/openerp/sql_db.py index 43a508f9082..37cb8b224bb 100644 --- a/openerp/sql_db.py +++ b/openerp/sql_db.py @@ -429,9 +429,8 @@ def db_connect(db_name): return Connection(_Pool, db_name) def close_db(db_name): - """ You might want to call openerp.netsvc.Agent.cancel(db_name) along this function.""" + """ You might want to call openerp.modules.registry.RegistryManager.delete(db_name) along this function.""" _Pool.close_all(dsn(db_name)) - tools.cache.clean_caches_for_db(db_name) ct = currentThread() if hasattr(ct, 'dbname'): delattr(ct, 'dbname')