summary refs log tree commit diff
path: root/synapse/storage/transactions.py
diff options
context:
space:
mode:
authorMatthew Hodgson <matthew@matrix.org>2014-12-08 17:48:57 +0000
committerMatthew Hodgson <matthew@matrix.org>2014-12-08 17:48:57 +0000
commit0d3fa1ac6e5257218a0c0dbda8cc015e77fe0a30 (patch)
treeb283d51e17ba52e7e3120c360f68448108c7d368 /synapse/storage/transactions.py
parentactually reset retry schedule if we can successfuly talk to it (diff)
downloadsynapse-0d3fa1ac6e5257218a0c0dbda8cc015e77fe0a30.tar.xz
add a write-through cache on the retry schedule
Diffstat (limited to 'synapse/storage/transactions.py')
-rw-r--r--synapse/storage/transactions.py19
1 files changed, 15 insertions, 4 deletions
diff --git a/synapse/storage/transactions.py b/synapse/storage/transactions.py
index cacd948302..fa51766e05 100644
--- a/synapse/storage/transactions.py
+++ b/synapse/storage/transactions.py
@@ -25,6 +25,9 @@ logger = logging.getLogger(__name__)
 class TransactionStore(SQLBaseStore):
     """A collection of queries for handling PDUs.
     """
+    
+    # a write-through cache of DestinationsTable.EntryType indexed by destination string
+    destination_retry_cache = {}
 
     def get_received_txn_response(self, transaction_id, origin):
         """For an incoming transaction from a given origin, check if we have
@@ -213,10 +216,11 @@ class TransactionStore(SQLBaseStore):
         
         Returns:
             None if not retrying
-            tuple: (retry_last_ts, retry_interval)
-                retry_ts: time of last retry attempt in unix epoch ms
-                retry_interval: how long until next retry in ms
+            Otherwise a DestinationsTable.EntryType for the retry scheme
         """
+        if self.destination_retry_cache[destination]:
+            return self.destination_retry_cache[destination]
+        
         return self.runInteraction(
             "get_destination_retry_timings",
             self._get_destination_retry_timings, destination)
@@ -225,7 +229,7 @@ class TransactionStore(SQLBaseStore):
         query = DestinationsTable.select_statement("destination = ?")
         txn.execute(query, (destination,))
         result = DestinationsTable.decode_single_result(txn.fetchone())
-        if result and result[0] > 0:
+        if result and result.retry_last_ts > 0:
             return result
         else:
             return None
@@ -239,6 +243,12 @@ class TransactionStore(SQLBaseStore):
             retry_last_ts (int) - time of last retry attempt in unix epoch ms
             retry_interval (int) - how long until next retry in ms
         """
+        
+        self.destination_retry_cache[destination] = (
+            DestinationsTable.EntryType(destination, retry_last_ts, retry_interval)
+        )
+        
+        # xxx: we could chose to not bother persisting this if our cache things this is a NOOP
         return self.runInteraction(
             "set_destination_retry_timings",
             self._set_destination_retry_timings, destination, retry_last_ts, retry_interval)
@@ -260,6 +270,7 @@ class TransactionStore(SQLBaseStore):
         Returns:
             list: A list of `DestinationsTable.EntryType`
         """
+                
         return self.runInteraction(
             "get_destinations_needing_retry",
             self._get_destinations_needing_retry