From 1d9b29190bac5905ac63ac428030c3897a9663a4 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Mon, 18 Nov 2019 17:47:41 +0000 Subject: [PATCH 1/3] Switch INSERT + UPDATE to UPSERT --- .../storage/data_stores/main/deviceinbox.py | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/synapse/storage/data_stores/main/deviceinbox.py b/synapse/storage/data_stores/main/deviceinbox.py index 96cd0fb77ade..6393c4f6ded0 100644 --- a/synapse/storage/data_stores/main/deviceinbox.py +++ b/synapse/storage/data_stores/main/deviceinbox.py @@ -359,20 +359,14 @@ def _add_messages_to_local_device_inbox_txn( 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(): From bc7a62398003a52a0ddf22652f079c653ff4ac23 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Mon, 18 Nov 2019 17:50:08 +0000 Subject: [PATCH 2/3] Add changelog --- changelog.d/6375.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/6375.bugfix diff --git a/changelog.d/6375.bugfix b/changelog.d/6375.bugfix new file mode 100644 index 000000000000..d023b49181cb --- /dev/null +++ b/changelog.d/6375.bugfix @@ -0,0 +1 @@ +Fix `to_device` stream ID getting reset every time Synapse restarts, which had the potential to cause unable to decrypt errors. \ No newline at end of file From 5f4b59d0ce098fe3ddcd969e67ca6b7a53e3d991 Mon Sep 17 00:00:00 2001 From: Andrew Morgan Date: Tue, 19 Nov 2019 10:49:40 +0000 Subject: [PATCH 3/3] Switch to using a delta file --- synapse/storage/data_stores/main/deviceinbox.py | 9 +-------- .../main/schema/delta/56/device_stream_id.sql | 5 +++++ 2 files changed, 6 insertions(+), 8 deletions(-) create mode 100644 synapse/storage/data_stores/main/schema/delta/56/device_stream_id.sql diff --git a/synapse/storage/data_stores/main/deviceinbox.py b/synapse/storage/data_stores/main/deviceinbox.py index 6393c4f6ded0..f04aad074339 100644 --- a/synapse/storage/data_stores/main/deviceinbox.py +++ b/synapse/storage/data_stores/main/deviceinbox.py @@ -358,14 +358,7 @@ def add_messages_txn(txn, now_ms, stream_id): def _add_messages_to_local_device_inbox_txn( self, txn, stream_id, messages_by_user_then_device ): - # Compatible method of performing an upsert - sql = """ - INSERT INTO device_max_stream_id - (stream_id) VALUES (?) - ON CONFLICT DO UPDATE device_max_stream_id - SET stream_id = ? - WHERE stream_id < ? - """ + sql = "UPDATE device_max_stream_id" " SET stream_id = ?" " WHERE stream_id < ?" txn.execute(sql, (stream_id, stream_id)) local_by_user_then_device = {} diff --git a/synapse/storage/data_stores/main/schema/delta/56/device_stream_id.sql b/synapse/storage/data_stores/main/schema/delta/56/device_stream_id.sql new file mode 100644 index 000000000000..ae261a70a28b --- /dev/null +++ b/synapse/storage/data_stores/main/schema/delta/56/device_stream_id.sql @@ -0,0 +1,5 @@ +INSERT INTO device_max_stream_id (stream_id) +SELECT 0 +WHERE NOT EXISTS ( + SELECT 1 FROM device_max_stream_id +); \ No newline at end of file