Replace UPDATE with UPSERT on device_max_stream_id table (#6363)
							parent
							
								
									53b6559a89
								
							
						
					
					
						commit
						657d614f6a
					
				| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					Fix `to_device` stream ID getting reset every time Synapse restarts, which had the potential to cause unable to decrypt errors.
 | 
				
			||||||
| 
						 | 
					@ -358,8 +358,21 @@ class DeviceInboxStore(DeviceInboxWorkerStore, DeviceInboxBackgroundUpdateStore)
 | 
				
			||||||
    def _add_messages_to_local_device_inbox_txn(
 | 
					    def _add_messages_to_local_device_inbox_txn(
 | 
				
			||||||
        self, txn, stream_id, messages_by_user_then_device
 | 
					        self, txn, stream_id, messages_by_user_then_device
 | 
				
			||||||
    ):
 | 
					    ):
 | 
				
			||||||
        sql = "UPDATE device_max_stream_id" " SET stream_id = ?" " WHERE stream_id < ?"
 | 
					        # Compatible method of performing an upsert
 | 
				
			||||||
        txn.execute(sql, (stream_id, stream_id))
 | 
					        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,))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        local_by_user_then_device = {}
 | 
					        local_by_user_then_device = {}
 | 
				
			||||||
        for user_id, messages_by_device in messages_by_user_then_device.items():
 | 
					        for user_id, messages_by_device in messages_by_user_then_device.items():
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue