summary refs log tree commit diff
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2019-07-19 16:51:16 +0100
committerGitHub <noreply@github.com>2019-07-19 16:51:16 +0100
commit7704873cb8d14169e6585c03f62d935d0e9d1121 (patch)
tree05e3f8cd10ca75209cf563a68ef044e0dc267a0e
parentMerge pull request #5713 from matrix-org/erikj/use_cache_for_filtered_state (diff)
parentNewsfile (diff)
downloadsynapse-7704873cb8d14169e6585c03f62d935d0e9d1121.tar.xz
Merge pull request #5720 from matrix-org/erikj/transactions_upsert
Use upsert when updating destination retry interval
-rw-r--r--changelog.d/5720.misc1
-rw-r--r--synapse/storage/transactions.py20
2 files changed, 21 insertions, 0 deletions
diff --git a/changelog.d/5720.misc b/changelog.d/5720.misc
new file mode 100644

index 0000000000..590f64f19d --- /dev/null +++ b/changelog.d/5720.misc
@@ -0,0 +1 @@ +Improve database query performance when recording retry intervals for remote hosts. diff --git a/synapse/storage/transactions.py b/synapse/storage/transactions.py
index fd18619178..c585cf6cf7 100644 --- a/synapse/storage/transactions.py +++ b/synapse/storage/transactions.py
@@ -196,6 +196,26 @@ class TransactionStore(SQLBaseStore): def _set_destination_retry_timings( self, txn, destination, retry_last_ts, retry_interval ): + + if self.database_engine.can_native_upsert: + # Upsert retry time interval if retry_interval is zero (i.e. we're + # resetting it) or greater than the existing retry interval. + + sql = """ + INSERT INTO destinations (destination, retry_last_ts, retry_interval) + VALUES (?, ?, ?) + ON CONFLICT (destination) DO UPDATE SET + retry_last_ts = EXCLUDED.retry_last_ts, + retry_interval = EXCLUDED.retry_interval + WHERE + EXCLUDED.retry_interval = 0 + OR destinations.retry_interval < EXCLUDED.retry_interval + """ + + txn.execute(sql, (destination, retry_last_ts, retry_interval)) + + return + self.database_engine.lock_table(txn, "destinations") # We need to be careful here as the data may have changed from under us