diff options
author | Erik Johnston <erik@matrix.org> | 2021-07-09 10:17:22 +0100 |
---|---|---|
committer | Erik Johnston <erik@matrix.org> | 2021-07-09 10:17:22 +0100 |
commit | 8a2be4f799d595cbef58297bb8ca723bed354d50 (patch) | |
tree | fc562129037ac65dab49f53be02d048c1d612dbc /synapse/storage | |
parent | Merge branch 'release-v1.38' into matrix-org-hotfixes (diff) | |
parent | Ensure we always drop the federation inbound lock (#10336) (diff) | |
download | synapse-8a2be4f799d595cbef58297bb8ca723bed354d50.tar.xz |
Merge remote-tracking branch 'origin/release-v1.38' into matrix-org-hotfixes
Diffstat (limited to 'synapse/storage')
-rw-r--r-- | synapse/storage/databases/main/events_bg_updates.py | 10 | ||||
-rw-r--r-- | synapse/storage/databases/main/lock.py | 15 |
2 files changed, 23 insertions, 2 deletions
diff --git a/synapse/storage/databases/main/events_bg_updates.py b/synapse/storage/databases/main/events_bg_updates.py index 1c95c66648..29f33bac55 100644 --- a/synapse/storage/databases/main/events_bg_updates.py +++ b/synapse/storage/databases/main/events_bg_updates.py @@ -1146,6 +1146,16 @@ class EventsBackgroundUpdatesStore(SQLBaseStore): logger.info("completing stream_ordering migration: %s", sql) txn.execute(sql) + # ANALYZE the new column to build stats on it, to encourage PostgreSQL to use the + # indexes on it. + # We need to pass execute a dummy function to handle the txn's result otherwise + # it tries to call fetchall() on it and fails because there's no result to fetch. + await self.db_pool.execute( + "background_analyze_new_stream_ordering_column", + lambda txn: None, + "ANALYZE events(stream_ordering2)", + ) + await self.db_pool.runInteraction( "_background_replace_stream_ordering_column", process ) diff --git a/synapse/storage/databases/main/lock.py b/synapse/storage/databases/main/lock.py index e76188328c..774861074c 100644 --- a/synapse/storage/databases/main/lock.py +++ b/synapse/storage/databases/main/lock.py @@ -310,14 +310,25 @@ class Lock: _excinst: Optional[BaseException], _exctb: Optional[TracebackType], ) -> bool: + await self.release() + + return False + + async def release(self) -> None: + """Release the lock. + + This is automatically called when using the lock as a context manager. + """ + + if self._dropped: + return + if self._looping_call.running: self._looping_call.stop() await self._store._drop_lock(self._lock_name, self._lock_key, self._token) self._dropped = True - return False - def __del__(self) -> None: if not self._dropped: # We should not be dropped without the lock being released (unless |