diff options
author | reivilibre <oliverw@matrix.org> | 2022-05-19 14:16:49 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-19 14:16:49 +0100 |
commit | 66a5f6c40018018cccffd79aded0850d13efe513 (patch) | |
tree | 9b645f47eb00ba8ff5e3ea27b4802e8673116560 /synapse/storage/background_updates.py | |
parent | hash_password: raise an error if no config file is specified (#12789) (diff) | |
download | synapse-66a5f6c40018018cccffd79aded0850d13efe513.tar.xz |
Add a unique index to `state_group_edges` to prevent duplicates being accidentally introduced and the consequential impact to performance. (#12687)
Diffstat (limited to 'synapse/storage/background_updates.py')
-rw-r--r-- | synapse/storage/background_updates.py | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/synapse/storage/background_updates.py b/synapse/storage/background_updates.py index 37f2d6c644..b1e5208c76 100644 --- a/synapse/storage/background_updates.py +++ b/synapse/storage/background_updates.py @@ -535,6 +535,7 @@ class BackgroundUpdater: where_clause: Optional[str] = None, unique: bool = False, psql_only: bool = False, + replaces_index: Optional[str] = None, ) -> None: """Helper for store classes to do a background index addition @@ -554,6 +555,8 @@ class BackgroundUpdater: unique: true to make a UNIQUE index psql_only: true to only create this index on psql databases (useful for virtual sqlite tables) + replaces_index: The name of an index that this index replaces. + The named index will be dropped upon completion of the new index. """ def create_index_psql(conn: Connection) -> None: @@ -585,6 +588,12 @@ class BackgroundUpdater: } logger.debug("[SQL] %s", sql) c.execute(sql) + + if replaces_index is not None: + # We drop the old index as the new index has now been created. + sql = f"DROP INDEX IF EXISTS {replaces_index}" + logger.debug("[SQL] %s", sql) + c.execute(sql) finally: conn.set_session(autocommit=False) # type: ignore @@ -613,6 +622,12 @@ class BackgroundUpdater: logger.debug("[SQL] %s", sql) c.execute(sql) + if replaces_index is not None: + # We drop the old index as the new index has now been created. + sql = f"DROP INDEX IF EXISTS {replaces_index}" + logger.debug("[SQL] %s", sql) + c.execute(sql) + if isinstance(self.db_pool.engine, engines.PostgresEngine): runner: Optional[Callable[[Connection], None]] = create_index_psql elif psql_only: |