From ff5426f6b8263b416f412725a6d7be2fac284824 Mon Sep 17 00:00:00 2001
From: Erik Johnston <erik@matrix.org>
Date: Tue, 24 Jul 2018 10:55:11 +0100
Subject: [PATCH 1/3] Speed up _calculate_state_delta

---
 synapse/storage/events.py | 13 +++----------
 1 file changed, 3 insertions(+), 10 deletions(-)

diff --git a/synapse/storage/events.py b/synapse/storage/events.py
index c2910094d0..1b075e6cc6 100644
--- a/synapse/storage/events.py
+++ b/synapse/storage/events.py
@@ -644,21 +644,14 @@ class EventsStore(EventsWorkerStore):
         """
         existing_state = yield self.get_current_state_ids(room_id)
 
-        existing_events = set(itervalues(existing_state))
-        new_events = set(ev_id for ev_id in itervalues(current_state))
-        changed_events = existing_events ^ new_events
-
-        if not changed_events:
-            return
-
         to_delete = {
             key: ev_id for key, ev_id in iteritems(existing_state)
-            if ev_id in changed_events
+            if ev_id != current_state.get(key)
         }
-        events_to_insert = (new_events - existing_events)
+
         to_insert = {
             key: ev_id for key, ev_id in iteritems(current_state)
-            if ev_id in events_to_insert
+            if ev_id != existing_state.get(key)
         }
 
         defer.returnValue((to_delete, to_insert))

From 2581eb3e1d9f7d767315432f2c2e381f31a8716c Mon Sep 17 00:00:00 2001
From: Erik Johnston <erik@matrix.org>
Date: Tue, 24 Jul 2018 11:14:28 +0100
Subject: [PATCH 2/3] Newsfile

---
 changelog.d/3592.misc | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 changelog.d/3592.misc

diff --git a/changelog.d/3592.misc b/changelog.d/3592.misc
new file mode 100644
index 0000000000..60129569c2
--- /dev/null
+++ b/changelog.d/3592.misc
@@ -0,0 +1 @@
+Speed up calculating state deltas in persist_event loop

From 0fa73e4a63d6cd5d402ea5213eac6b766e650321 Mon Sep 17 00:00:00 2001
From: Erik Johnston <erik@matrix.org>
Date: Tue, 24 Jul 2018 11:19:23 +0100
Subject: [PATCH 3/3] Remove unnecessary if

---
 synapse/storage/events.py | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/synapse/storage/events.py b/synapse/storage/events.py
index 1b075e6cc6..cc8ab5165b 100644
--- a/synapse/storage/events.py
+++ b/synapse/storage/events.py
@@ -428,8 +428,7 @@ class EventsStore(EventsWorkerStore):
                                 delta = yield self._calculate_state_delta(
                                     room_id, current_state,
                                 )
-                                if delta is not None:
-                                    state_delta_for_room[room_id] = delta
+                                state_delta_for_room[room_id] = delta
 
                 yield self.runInteraction(
                     "persist_events",