[FIX] ormcache: correct stat counter usage.

This commit is contained in:
Christophe Simonis 2015-04-13 13:17:23 +02:00
parent cad5dffdfa
commit d1031c34ac
1 changed files with 16 additions and 15 deletions

View File

@ -59,26 +59,27 @@ class ormcache(object):
return lookup return lookup
def lru(self, model): def lru(self, model):
return model.pool.cache, (model._name, self.method) counter = STAT[(model.pool.db_name, model._name, self.method)]
return model.pool.cache, (model._name, self.method), counter
def lookup(self, method, *args, **kwargs): def lookup(self, method, *args, **kwargs):
d, key0 = self.lru(args[0]) d, key0, counter = self.lru(args[0])
key = key0 + args[self.skiparg:] key = key0 + args[self.skiparg:]
try: try:
r = d[key] r = d[key]
STAT[key0].hit += 1 counter.hit += 1
return r return r
except KeyError: except KeyError:
STAT[key0].miss += 1 counter.miss += 1
value = d[key] = self.method(*args, **kwargs) value = d[key] = self.method(*args, **kwargs)
return value return value
except TypeError: except TypeError:
STAT[key0].err += 1 counter.err += 1
return self.method(*args, **kwargs) return self.method(*args, **kwargs)
def clear(self, model, *args): def clear(self, model, *args):
""" Remove *args entry from the cache or all keys if *args is undefined """ """ Remove *args entry from the cache or all keys if *args is undefined """
d, key0 = self.lru(model) d, key0, _ = self.lru(model)
if args: if args:
_logger.warn("ormcache.clear arguments are deprecated and ignored " _logger.warn("ormcache.clear arguments are deprecated and ignored "
"(while clearing caches on (%s).%s)", "(while clearing caches on (%s).%s)",
@ -99,7 +100,7 @@ class ormcache_context(ormcache):
return super(ormcache_context, self).__call__(method) return super(ormcache_context, self).__call__(method)
def lookup(self, method, *args, **kwargs): def lookup(self, method, *args, **kwargs):
d, key0 = self.lru(args[0]) d, key0, counter = self.lru(args[0])
# Note. The decorator() wrapper (used in __call__ above) will resolve # Note. The decorator() wrapper (used in __call__ above) will resolve
# arguments, and pass them positionally to lookup(). This is why context # arguments, and pass them positionally to lookup(). This is why context
@ -114,14 +115,14 @@ class ormcache_context(ormcache):
key = key0 + args[self.skiparg:self.context_pos] + tuple(ckey) key = key0 + args[self.skiparg:self.context_pos] + tuple(ckey)
try: try:
r = d[key] r = d[key]
STAT[key0].hit += 1 counter.hit += 1
return r return r
except KeyError: except KeyError:
STAT[key0].miss += 1 counter.miss += 1
value = d[key] = self.method(*args, **kwargs) value = d[key] = self.method(*args, **kwargs)
return value return value
except TypeError: except TypeError:
STAT[key0].err += 1 counter.err += 1
return self.method(*args, **kwargs) return self.method(*args, **kwargs)
@ -132,7 +133,7 @@ class ormcache_multi(ormcache):
self.multi = multi self.multi = multi
def lookup(self, method, *args, **kwargs): def lookup(self, method, *args, **kwargs):
d, key0 = self.lru(args[0]) d, key0, counter = self.lru(args[0])
base_key = key0 + args[self.skiparg:self.multi] + args[self.multi+1:] base_key = key0 + args[self.skiparg:self.multi] + args[self.multi+1:]
ids = args[self.multi] ids = args[self.multi]
result = {} result = {}
@ -143,9 +144,9 @@ class ormcache_multi(ormcache):
key = base_key + (i,) key = base_key + (i,)
try: try:
result[i] = d[key] result[i] = d[key]
STAT[key0].hit += 1 counter.hit += 1
except Exception: except Exception:
STAT[key0].miss += 1 counter.miss += 1
missed.append(i) missed.append(i)
if missed: if missed:
@ -183,9 +184,9 @@ def log_ormcache_stats(sig=None, frame=None):
me = threading.currentThread() me = threading.currentThread()
me_dbname = me.dbname me_dbname = me.dbname
entries = defaultdict(int) entries = defaultdict(int)
for reg in RegistryManager.registries.itervalues(): for dbname, reg in RegistryManager.registries.iteritems():
for key in reg.cache.iterkeys(): for key in reg.cache.iterkeys():
entries[key[:3]] += 1 entries[(dbname,) + key[:2]] += 1
for key, count in sorted(entries.items()): for key, count in sorted(entries.items()):
dbname, model_name, method = key dbname, model_name, method = key
me.dbname = dbname me.dbname = dbname