Fix a performance issue introduced in Synapse v1.83.0 which meant that purging rooms was very slow and database-intensive. (#15693)
* Add indices required to efficiently validate new foreign key constraints on stream_ordering * Newsfile Signed-off-by: Olivier Wilkinson (reivilibre) <oliverw@matrix.org> --------- Signed-off-by: Olivier Wilkinson (reivilibre) <oliverw@matrix.org>pull/15699/head
							parent
							
								
									7477810cc2
								
							
						
					
					
						commit
						11e15d79b8
					
				|  | @ -0,0 +1 @@ | |||
| Fix a performance issue introduced in Synapse v1.83.0 which meant that purging rooms was very slow and database-intensive. | ||||
|  | @ -261,6 +261,16 @@ class StateBackgroundUpdateStore(StateGroupBackgroundUpdateStore): | |||
|     STATE_GROUPS_ROOM_INDEX_UPDATE_NAME = "state_groups_room_id_idx" | ||||
|     STATE_GROUP_EDGES_UNIQUE_INDEX_UPDATE_NAME = "state_group_edges_unique_idx" | ||||
| 
 | ||||
|     CURRENT_STATE_EVENTS_STREAM_ORDERING_INDEX_UPDATE_NAME = ( | ||||
|         "current_state_events_stream_ordering_idx" | ||||
|     ) | ||||
|     ROOM_MEMBERSHIPS_STREAM_ORDERING_INDEX_UPDATE_NAME = ( | ||||
|         "room_memberships_stream_ordering_idx" | ||||
|     ) | ||||
|     LOCAL_CURRENT_MEMBERSHIP_STREAM_ORDERING_INDEX_UPDATE_NAME = ( | ||||
|         "local_current_membership_stream_ordering_idx" | ||||
|     ) | ||||
| 
 | ||||
|     def __init__( | ||||
|         self, | ||||
|         database: DatabasePool, | ||||
|  | @ -297,6 +307,27 @@ class StateBackgroundUpdateStore(StateGroupBackgroundUpdateStore): | |||
|             replaces_index="state_group_edges_idx", | ||||
|         ) | ||||
| 
 | ||||
|         # These indices are needed to validate the foreign key constraint | ||||
|         # when events are deleted. | ||||
|         self.db_pool.updates.register_background_index_update( | ||||
|             self.CURRENT_STATE_EVENTS_STREAM_ORDERING_INDEX_UPDATE_NAME, | ||||
|             index_name="current_state_events_stream_ordering_idx", | ||||
|             table="current_state_events", | ||||
|             columns=["event_stream_ordering"], | ||||
|         ) | ||||
|         self.db_pool.updates.register_background_index_update( | ||||
|             self.ROOM_MEMBERSHIPS_STREAM_ORDERING_INDEX_UPDATE_NAME, | ||||
|             index_name="room_memberships_stream_ordering_idx", | ||||
|             table="room_memberships", | ||||
|             columns=["event_stream_ordering"], | ||||
|         ) | ||||
|         self.db_pool.updates.register_background_index_update( | ||||
|             self.LOCAL_CURRENT_MEMBERSHIP_STREAM_ORDERING_INDEX_UPDATE_NAME, | ||||
|             index_name="local_current_membership_stream_ordering_idx", | ||||
|             table="local_current_membership", | ||||
|             columns=["event_stream_ordering"], | ||||
|         ) | ||||
| 
 | ||||
|     async def _background_deduplicate_state( | ||||
|         self, progress: dict, batch_size: int | ||||
|     ) -> int: | ||||
|  |  | |||
|  | @ -0,0 +1,20 @@ | |||
| /* Copyright 2023 The Matrix.org Foundation C.I.C. | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  *    http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| 
 | ||||
| INSERT INTO background_updates (ordering, update_name, progress_json) | ||||
|     VALUES | ||||
|         (7714, 'current_state_events_stream_ordering_idx', '{}'), | ||||
|         (7714, 'local_current_membership_stream_ordering_idx', '{}'), | ||||
|         (7714, 'room_memberships_stream_ordering_idx', '{}'); | ||||
		Loading…
	
		Reference in New Issue
	
	 reivilibre
						reivilibre