Skip to content

Commit

Permalink
[FIX] registry: do not signal a phantom cache clear on load
Browse files Browse the repository at this point in the history
During loading, the registry clears all `ormcache` data multiple
times, in order to ensure consistency with the newly loaded module
data.

Since 083c70b, this was done by
calling `self.clear_caches()`, with the side-effect
of signalling to all other worker processes that the cache
*needs* to be invalidated, which is actually untrue.

If the other workers have any reason to reload their own registries,
they will also clear their own cache in the process - there is no
need to forcefully invalidate it globally.

One could think that combining the pre-fork mode with the `-d <db>`
parameter would mitigate this issue, by making all workers inherit from
a fully loaded registry, In reality it doesn't work, because they also
inherit from the `cache_invalidated=True` flag, that was never cleared
in the master process. So despite having a fully loaded registry, the
newly forked workers will signal a cache invalidation upon serving
their first request.

Further, in a multi-tenant setup with large numbers of databases,
registries may be recycled and loaded much more frequently than
new workers are starting, due to the limited registry LRU, amplifying
this effect a bit.

~~

This patch directly clears the cache LRU without going through
`clear_cache()`, avoiding setting the `cache_invalidated` flag of the
registry, and thus not signalling to other workers.

This is similar to what was being done before 083c70b,
where the LRU was dropped like all other lazy properties.

X-original-commit: 87aef4e
  • Loading branch information
odony committed Feb 1, 2021
1 parent ccf5f07 commit 654052d
Showing 1 changed file with 6 additions and 2 deletions.
8 changes: 6 additions & 2 deletions odoo/modules/registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,9 @@ def load(self, cr, module):
"""
from .. import models

self.clear_caches()
# clear cache to ensure consistency, but do not signal it
self.__cache.clear()

lazy_property.reset_all(self)

# Instantiate registered classes (via the MetaModel automatic discovery
Expand All @@ -244,7 +246,9 @@ def setup_models(self, cr):
for model in env.values():
model._unregister_hook()

self.clear_caches()
# clear cache to ensure consistency, but do not signal it
self.__cache.clear()

lazy_property.reset_all(self)
self.registry_invalidated = True

Expand Down

0 comments on commit 654052d

Please sign in to comment.