[FIX] multi-process signaling: one query instead of two (based on chs idea).
authorVo Minh Thu <vmt@openerp.com>
Thu, 8 Mar 2012 08:45:54 +0000 (09:45 +0100)
committerVo Minh Thu <vmt@openerp.com>
Thu, 8 Mar 2012 08:45:54 +0000 (09:45 +0100)
bzr revid: vmt@openerp.com-20120308084554-bnyz7gd7nlka3141

openerp/modules/registry.py

index 036f8f6..0eccc5c 100644 (file)
@@ -261,33 +261,28 @@ class RegistryManager(object):
     @classmethod
     def check_registry_signaling(cls, db_name):
         if openerp.multi_process and db_name in cls.registries:
-            # Check if the model registry must be reloaded (e.g. after the
-            # database has been updated by another process).
             registry = cls.get(db_name, pooljobs=False)
             cr = registry.db.cursor()
-            registry_reloaded = False
             try:
-                cr.execute('SELECT last_value FROM base_registry_signaling')
-                r = cr.fetchone()[0]
+                cr.execute("""
+                    SELECT base_registry_signaling.last_value,
+                           base_cache_signaling.last_value
+                    FROM base_registry_signaling, base_cache_signaling""")
+                r, c = cr.fetchone()
+                print ">>>", r, c
+                # Check if the model registry must be reloaded (e.g. after the
+                # database has been updated by another process).
                 if registry.base_registry_signaling_sequence != r:
                     _logger.info("Reloading the model registry after database signaling.")
                     # Don't run the cron in the Gunicorn worker.
                     registry = cls.new(db_name, pooljobs=False)
                     registry.base_registry_signaling_sequence = r
-                    registry_reloaded = True
-            finally:
-                cr.close()
-
-            # Check if the model caches must be invalidated (e.g. after a write
-            # occured on another process). Don't clear right after a registry
-            # has been reload.
-            cr = openerp.sql_db.db_connect(db_name).cursor()
-            try:
-                cr.execute('SELECT last_value FROM base_cache_signaling')
-                r = cr.fetchone()[0]
-                if registry.base_cache_signaling_sequence != r and not registry_reloaded:
+                # Check if the model caches must be invalidated (e.g. after a write
+                # occured on another process). Don't clear right after a registry
+                # has been reload.
+                elif registry.base_cache_signaling_sequence != c:
                     _logger.info("Invalidating all model caches after database signaling.")
-                    registry.base_cache_signaling_sequence = r
+                    registry.base_cache_signaling_sequence = c
                     registry.clear_caches()
                     registry.reset_any_cache_cleared()
             finally: