summary refs log tree commit diff
path: root/synapse/util
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2015-08-05 15:06:51 +0100
committerErik Johnston <erik@matrix.org>2015-08-05 15:11:42 +0100
commit07507643cb6a2fde1a87d229f8d77525627a0632 (patch)
tree0f776b47e8987cbfaad3be0170601b72e7f9e79c /synapse/util
parentMove DictionaryCache (diff)
downloadsynapse-07507643cb6a2fde1a87d229f8d77525627a0632.tar.xz
Use dictionary cache to do group -> state fetching
Diffstat (limited to 'synapse/util')
-rw-r--r--synapse/util/dictionary_cache.py58
1 files changed, 35 insertions, 23 deletions
diff --git a/synapse/util/dictionary_cache.py b/synapse/util/dictionary_cache.py
index 0877cc79f6..38b131677c 100644
--- a/synapse/util/dictionary_cache.py
+++ b/synapse/util/dictionary_cache.py
@@ -16,6 +16,10 @@
 from synapse.util.lrucache import LruCache
 from collections import namedtuple
 import threading
+import logging
+
+
+logger = logging.getLogger(__name__)
 
 
 DictionaryEntry = namedtuple("DictionaryEntry", ("full", "value"))
@@ -47,21 +51,25 @@ class DictionaryCache(object):
                 )
 
     def get(self, key, dict_keys=None):
-        entry = self.cache.get(key, self.sentinel)
-        if entry is not self.sentinel:
-            # cache_counter.inc_hits(self.name)
-
-            if dict_keys is None:
-                return DictionaryEntry(entry.full, dict(entry.value))
-            else:
-                return DictionaryEntry(entry.full, {
-                    k: entry.value[k]
-                    for k in dict_keys
-                    if k in entry.value
-                })
-
-        # cache_counter.inc_misses(self.name)
-        return DictionaryEntry(False, {})
+        try:
+            entry = self.cache.get(key, self.sentinel)
+            if entry is not self.sentinel:
+                # cache_counter.inc_hits(self.name)
+
+                if dict_keys is None:
+                    return DictionaryEntry(entry.full, dict(entry.value))
+                else:
+                    return DictionaryEntry(entry.full, {
+                        k: entry.value[k]
+                        for k in dict_keys
+                        if k in entry.value
+                    })
+
+            # cache_counter.inc_misses(self.name)
+            return DictionaryEntry(False, {})
+        except:
+            logger.exception("get failed")
+            raise
 
     def invalidate(self, key):
         self.check_thread()
@@ -77,14 +85,18 @@ class DictionaryCache(object):
         self.cache.clear()
 
     def update(self, sequence, key, value, full=False):
-        self.check_thread()
-        if self.sequence == sequence:
-            # Only update the cache if the caches sequence number matches the
-            # number that the cache had before the SELECT was started (SYN-369)
-            if full:
-                self._insert(key, value)
-            else:
-                self._update_or_insert(key, value)
+        try:
+            self.check_thread()
+            if self.sequence == sequence:
+                # Only update the cache if the caches sequence number matches the
+                # number that the cache had before the SELECT was started (SYN-369)
+                if full:
+                    self._insert(key, value)
+                else:
+                    self._update_or_insert(key, value)
+        except:
+            logger.exception("update failed")
+            raise
 
     def _update_or_insert(self, key, value):
         entry = self.cache.setdefault(key, DictionaryEntry(False, {}))