diff options
author | Travis Ralston <travpc@gmail.com> | 2018-10-12 14:49:58 -0600 |
---|---|---|
committer | Travis Ralston <travpc@gmail.com> | 2018-10-12 14:49:58 -0600 |
commit | e3586f7c06f3c779e87f9ea3bf4e4ac549a451c9 (patch) | |
tree | 2ef1ecdb2f2c6641a81a47adf51fda62343be7e3 /synapse/util/caches/expiringcache.py | |
parent | Remove debugging statement (diff) | |
parent | Make workers work on Py3 (#4027) (diff) | |
download | synapse-e3586f7c06f3c779e87f9ea3bf4e4ac549a451c9.tar.xz |
Merge branch 'develop' into travis/fix-federated-group-requests
Diffstat (limited to 'synapse/util/caches/expiringcache.py')
-rw-r--r-- | synapse/util/caches/expiringcache.py | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/synapse/util/caches/expiringcache.py b/synapse/util/caches/expiringcache.py index 9af4ec4aa8..f369780277 100644 --- a/synapse/util/caches/expiringcache.py +++ b/synapse/util/caches/expiringcache.py @@ -16,7 +16,7 @@ import logging from collections import OrderedDict -from six import itervalues +from six import iteritems, itervalues from synapse.metrics.background_process_metrics import run_as_background_process from synapse.util.caches import register_cache @@ -24,6 +24,9 @@ from synapse.util.caches import register_cache logger = logging.getLogger(__name__) +SENTINEL = object() + + class ExpiringCache(object): def __init__(self, cache_name, clock, max_len=0, expiry_ms=0, reset_expiry_on_get=False, iterable=False): @@ -95,6 +98,21 @@ class ExpiringCache(object): return entry.value + def pop(self, key, default=SENTINEL): + """Removes and returns the value with the given key from the cache. + + If the key isn't in the cache then `default` will be returned if + specified, otherwise `KeyError` will get raised. + + Identical functionality to `dict.pop(..)`. + """ + + value = self._cache.pop(key, default) + if value is SENTINEL: + raise KeyError(key) + + return value + def __contains__(self, key): return key in self._cache @@ -122,7 +140,7 @@ class ExpiringCache(object): keys_to_delete = set() - for key, cache_entry in self._cache.items(): + for key, cache_entry in iteritems(self._cache): if now - cache_entry.time > self._expiry_ms: keys_to_delete.add(key) @@ -146,6 +164,8 @@ class ExpiringCache(object): class _CacheEntry(object): + __slots__ = ["time", "value"] + def __init__(self, time, value): self.time = time self.value = value |