summary refs log tree commit diff
path: root/synapse/util
diff options
context:
space:
mode:
authorErik Johnston <erikj@jki.re>2016-08-02 15:21:37 +0100
committerGitHub <noreply@github.com>2016-08-02 15:21:37 +0100
commit7b0f6293f27c52194d86c3944a590d096e024f1b (patch)
treeebc1480decfa0f4063ec74628ae8e01bb84b5fc3 /synapse/util
parentPrint authorization header for federation_client.py (diff)
parentCache federation state responses (diff)
downloadsynapse-7b0f6293f27c52194d86c3944a590d096e024f1b.tar.xz
Merge pull request #940 from matrix-org/erikj/fed_state_cache
Cache federation state responses
Diffstat (limited to 'synapse/util')
-rw-r--r--synapse/util/caches/response_cache.py13
1 files changed, 11 insertions, 2 deletions
diff --git a/synapse/util/caches/response_cache.py b/synapse/util/caches/response_cache.py
index 36686b479e..00af539880 100644
--- a/synapse/util/caches/response_cache.py
+++ b/synapse/util/caches/response_cache.py
@@ -24,9 +24,12 @@ class ResponseCache(object):
     used rather than trying to compute a new response.
     """
 
-    def __init__(self):
+    def __init__(self, hs, timeout_ms=0):
         self.pending_result_cache = {}  # Requests that haven't finished yet.
 
+        self.clock = hs.get_clock()
+        self.timeout_sec = timeout_ms / 1000.
+
     def get(self, key):
         result = self.pending_result_cache.get(key)
         if result is not None:
@@ -39,7 +42,13 @@ class ResponseCache(object):
         self.pending_result_cache[key] = result
 
         def remove(r):
-            self.pending_result_cache.pop(key, None)
+            if self.timeout_sec:
+                self.clock.call_later(
+                    self.timeout_sec,
+                    self.pending_result_cache.pop, key, None,
+                )
+            else:
+                self.pending_result_cache.pop(key, None)
             return r
 
         result.addBoth(remove)