Move @cached decorator out into synapse.storage._base; add minimal docs

pull/90/head
Paul "LeoNerd" Evans 2015-02-19 17:29:39 +00:00
parent 61959928bb
commit 077d200342
2 changed files with 36 additions and 27 deletions

View File

@ -35,6 +35,41 @@ sql_logger = logging.getLogger("synapse.storage.SQL")
transaction_logger = logging.getLogger("synapse.storage.txn")
# TODO(paul):
# * Move this somewhere higher-level, shared;
# * more generic key management
# * export monitoring stats
# * maximum size; just evict things at random, or consider LRU?
def cached(orig):
""" A method decorator that applies a memoizing cache around the function.
The function is presumed to take one additional argument, which is used as
the key for the cache. Cache hits are served directly from the cache;
misses use the function body to generate the value.
The wrapped function has an additional member, a callable called
"invalidate". This can be used to remove individual entries from the cache.
"""
cache = {}
@defer.inlineCallbacks
def wrapped(self, key):
if key in cache:
defer.returnValue(cache[key])
ret = yield orig(self, key)
cache[key] = ret;
defer.returnValue(ret)
def invalidate(key):
if key in cache:
del cache[key]
wrapped.invalidate = invalidate
return wrapped
class LoggingTransaction(object):
"""An object that almost-transparently proxies for the 'txn' object
passed to the constructor. Adds logging to the .execute() method."""

View File

@ -17,7 +17,7 @@ from twisted.internet import defer
from collections import namedtuple
from ._base import SQLBaseStore
from ._base import SQLBaseStore, cached
from synapse.api.constants import Membership
from synapse.types import UserID
@ -33,32 +33,6 @@ RoomsForUser = namedtuple(
)
# TODO(paul):
# * Move this somewhere higher-level, shared;
# * more generic key management
# * export monitoring stats
# * maximum size; just evict things at random, or consider LRU?
def cached(orig):
cache = {}
@defer.inlineCallbacks
def wrapped(self, key):
if key in cache:
defer.returnValue(cache[key])
ret = yield orig(self, key)
cache[key] = ret;
defer.returnValue(ret)
def invalidate(key):
if key in cache:
del cache[key]
wrapped.invalidate = invalidate
return wrapped
class RoomMemberStore(SQLBaseStore):
def __init__(self, *args, **kw):