[FIX] modules: set initial values for multi-process signaling to None to avoid missin...
authorOlivier Dony <odo@openerp.com>
Thu, 16 Jan 2014 15:11:57 +0000 (16:11 +0100)
committerDenis Ledoux <dle@openerp.com>
Thu, 16 Jan 2014 15:11:57 +0000 (16:11 +0100)
For fresh databases, the signaling sequences in the
database stays at 1 until the installation of the
first module. If several workers are hit for this
database before the first module is installed,
this database registry will be loaded with a signaling
sequence of 1. Since  was the default value, any
signal received by workers in this state was ignored
because they thought the registry was previously
not loaded.
Using None to indicate an  sequence value
is more accurate and avoids this error

bzr revid: dle@openerp.com-20140116151157-3zlyrg48xqn2lkd0

openerp/modules/registry.py

index 3b33e63..a18bd46 100644 (file)
@@ -66,8 +66,8 @@ class Registry(object):
         # must be reloaded.
         # The `base_cache_signaling sequence` indicates all caches must be
         # invalidated (i.e. cleared).
-        self.base_registry_signaling_sequence = 1
-        self.base_cache_signaling_sequence = 1
+        self.base_registry_signaling_sequence = None
+        self.base_cache_signaling_sequence = None
 
         # Flag indicating if at least one model cache has been cleared.
         # Useful only in a multi-process context.
@@ -283,15 +283,19 @@ class RegistryManager(object):
                            base_cache_signaling.last_value
                     FROM base_registry_signaling, base_cache_signaling""")
                 r, c = cr.fetchone()
+                _logger.debug("Multiprocess signaling check: [Registry - old# %s new# %s] "\
+                    "[Cache - old# %s new# %s]",
+                    registry.base_registry_signaling_sequence, r,
+                    registry.base_cache_signaling_sequence, 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 > 1 and registry.base_registry_signaling_sequence != r:
+                if registry.base_registry_signaling_sequence is not None and registry.base_registry_signaling_sequence != r:
                     _logger.info("Reloading the model registry after database signaling.")
                     registry = cls.new(db_name)
                 # 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 > 1 and registry.base_cache_signaling_sequence != c:
+                elif registry.base_cache_signaling_sequence is not None and registry.base_cache_signaling_sequence != c:
                     _logger.info("Invalidating all model caches after database signaling.")
                     registry.clear_caches()
                     registry.reset_any_cache_cleared()
@@ -328,6 +332,7 @@ class RegistryManager(object):
     @classmethod
     def signal_registry_change(cls, db_name):
         if openerp.multi_process and db_name in cls.registries:
+            _logger.info("Registry changed, signaling through the database")
             registry = cls.get(db_name)
             cr = registry.db.cursor()
             r = 1