# HG changeset patch # User Sylvain Thénault # Date 1489563027 -3600 # Node ID 94ae25593c3837df402ab63efacfb78e2c3d87dc # Parent 0cdf5fafd234cc47024bde29858faf692b4da605 [repo] Consistent API for cache clearing clear_caches, reset_caches, clear_eid_caches are now all named 'clear_caches' with optional eids/etypes arguments to clear eid specific cache entry, diff -r 0cdf5fafd234 -r 94ae25593c38 cubicweb/devtools/__init__.py --- a/cubicweb/devtools/__init__.py Fri Mar 03 13:09:11 2017 +0100 +++ b/cubicweb/devtools/__init__.py Wed Mar 15 08:30:27 2017 +0100 @@ -124,9 +124,8 @@ if repo._needs_refresh: for cnxset in repo.cnxsets: cnxset.reconnect() - repo._type_cache = {} repo.querier.set_schema(repo.schema) - repo.system_source.reset_caches() + repo.clear_caches() repo._needs_refresh = False diff -r 0cdf5fafd234 -r 94ae25593c38 cubicweb/server/repository.py --- a/cubicweb/server/repository.py Fri Mar 03 13:09:11 2017 +0100 +++ b/cubicweb/server/repository.py Wed Mar 15 08:30:27 2017 +0100 @@ -660,17 +660,23 @@ # * correspondance between eid and type # * correspondance between eid and local id (i.e. specific to a given source) - def clear_caches(self, eids): - etcache = self._type_cache - rqlcache = self.querier.rql_cache - for eid in eids: - try: - etype = etcache.pop(int(eid)) # may be a string in some cases - rqlcache.pop(('%s X WHERE X eid %s' % (etype, eid),), None) - except KeyError: - etype = None - rqlcache.pop(('Any X WHERE X eid %s' % eid,), None) - self.system_source.clear_eid_cache(eid, etype) + def clear_caches(self, eids=None): + if eids is None: + self._type_cache = {} + etypes = None + else: + etypes = [] + etcache = self._type_cache + rqlcache = self.querier.rql_cache + for eid in eids: + try: + etype = etcache.pop(int(eid)) # may be a string in some cases + rqlcache.pop(('%s X WHERE X eid %s' % (etype, eid),), None) + except KeyError: + etype = None + rqlcache.pop(('Any X WHERE X eid %s' % eid,), None) + etypes.append(etype) + self.system_source.clear_caches(eids, etypes) def type_from_eid(self, eid, cnx): """Return the type of the entity with id `eid`""" diff -r 0cdf5fafd234 -r 94ae25593c38 cubicweb/server/sources/native.py --- a/cubicweb/server/sources/native.py Fri Mar 03 13:09:11 2017 +0100 +++ b/cubicweb/server/sources/native.py Wed Mar 15 08:30:27 2017 +0100 @@ -30,7 +30,7 @@ import sys from six import PY2, text_type, string_types -from six.moves import range, cPickle as pickle +from six.moves import range, cPickle as pickle, zip from logilab.common.decorators import cached, clear_cache from logilab.common.configuration import Method @@ -361,15 +361,17 @@ authentifier.source = self authentifier.set_schema(self.schema) - def reset_caches(self): - """method called during test to reset potential source caches""" - self._cache = QueryCache(self.repo.config['rql-cache-size']) - - def clear_eid_cache(self, eid, etype): - """clear potential caches for the given eid""" - self._cache.pop('Any X WHERE X eid %s, X is %s' % (eid, etype), None) - self._cache.pop('Any X WHERE X eid %s' % eid, None) - self._cache.pop('Any %s' % eid, None) + def clear_caches(self, eids, etypes): + """Clear potential source caches.""" + if eids is None: + self._cache = QueryCache(self.repo.config['rql-cache-size']) + else: + cache = self._cache + for eid, etype in zip(eids, etypes): + cache.pop('Any X WHERE X eid %s' % eid, None) + cache.pop('Any %s' % eid, None) + if etype is not None: + cache.pop('Any X WHERE X eid %s, X is %s' % (eid, etype), None) @statsd_timeit def sqlexec(self, cnx, sql, args=None):