summary refs log tree commit diff
diff options
context:
space:
mode:
authorAndrew Morgan <andrew@amorgan.xyz>2019-11-18 17:47:41 +0000
committerAndrew Morgan <andrew@amorgan.xyz>2019-11-18 17:47:41 +0000
commit1d9b29190bac5905ac63ac428030c3897a9663a4 (patch)
treea40a028200b43f34bcccc863ec4c9b90ce5b9a8a
parentReplace UPDATE with UPSERT on device_max_stream_id table (#6363) (diff)
downloadsynapse-1d9b29190bac5905ac63ac428030c3897a9663a4.tar.xz
Switch INSERT + UPDATE to UPSERT
-rw-r--r--synapse/storage/data_stores/main/deviceinbox.py22
1 files changed, 8 insertions, 14 deletions
diff --git a/synapse/storage/data_stores/main/deviceinbox.py b/synapse/storage/data_stores/main/deviceinbox.py
index 96cd0fb77a..6393c4f6de 100644
--- a/synapse/storage/data_stores/main/deviceinbox.py
+++ b/synapse/storage/data_stores/main/deviceinbox.py
@@ -359,20 +359,14 @@ class DeviceInboxStore(DeviceInboxWorkerStore, DeviceInboxBackgroundUpdateStore)
         self, txn, stream_id, messages_by_user_then_device
     ):
         # Compatible method of performing an upsert
-        sql = "SELECT stream_id FROM device_max_stream_id"
-
-        txn.execute(sql)
-        rows = txn.fetchone()
-        if rows:
-            db_stream_id = rows[0]
-            if db_stream_id < stream_id:
-                # Insert the new stream_id
-                sql = "UPDATE device_max_stream_id SET stream_id = ?"
-        else:
-            # No rows, perform an insert
-            sql = "INSERT INTO device_max_stream_id (stream_id) VALUES (?)"
-
-        txn.execute(sql, (stream_id,))
+        sql = """
+            INSERT INTO device_max_stream_id
+            (stream_id) VALUES (?)
+            ON CONFLICT DO UPDATE device_max_stream_id
+            SET stream_id = ?
+            WHERE stream_id < ?
+        """
+        txn.execute(sql, (stream_id, stream_id))
 
         local_by_user_then_device = {}
         for user_id, messages_by_device in messages_by_user_then_device.items():