diff --git a/synapse/storage/events.py b/synapse/storage/events.py index 9f57760ab0..2fd9f4045b 100644 --- a/synapse/storage/events.py +++ b/synapse/storage/events.py @@ -483,6 +483,10 @@ class EventsStore(SQLBaseStore): retcols=["event_id", "type", "state_key"], ) + # Figure out what has changed (if anything). Then we simply delete + # and readd the keys that have been changed. + # This saves us from deleting and reinserting thousands of rows for + # large rooms. existing_events = set(row["event_id"] for row in existing_state_rows) new_events = set(ev_id for ev_id in current_state.itervalues()) changed_events = existing_events ^ new_events @@ -492,14 +496,6 @@ class EventsStore(SQLBaseStore): [(ev_id,) for ev_id in changed_events], ) - # Add an entry to the current_state_resets table to record the point - # where we clobbered the current state - self._simple_insert_txn( - txn, - table="current_state_resets", - values={"event_stream_ordering": max_stream_order} - ) - events_to_insert = (new_events - existing_events) to_insert = [ (key, ev_id) for key, ev_id in current_state.iteritems() @@ -519,6 +515,13 @@ class EventsStore(SQLBaseStore): ], ) + # Invalidate the various caches + + # Figure out the changes of membership to invalidate the + # `get_rooms_for_user` cache. + # We find out which membership events we may have deleted + # and which we have added, then we invlidate the caches for all + # those users. members_changed = set( row["state_key"] for row in existing_state_rows if row["event_id"] in changed_events @@ -534,6 +537,14 @@ class EventsStore(SQLBaseStore): txn.call_after(self.get_users_in_room.invalidate, (room_id,)) + # Add an entry to the current_state_resets table to record the point + # where we clobbered the current state + self._simple_insert_txn( + txn, + table="current_state_resets", + values={"event_stream_ordering": max_stream_order} + ) + for room_id, new_extrem in new_forward_extremeties.items(): self._simple_delete_txn( txn,