mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-07-22 09:10:37 -04:00
Include method in thumbnail media name (#7124)
This fixes an issue where different methods (crop/scale) overwrite each other. This first tries the new path. If that fails and we are looking for a remote thumbnail, it tries the old path. If that still isn't found, it continues as normal. This should probably be removed in the future, after some of the newer thumbnails were generated with the new path on most deployments. Then the overhead should be minimal if the other thumbnails need to be regenerated. Signed-off-by: Nicolas Werner <nicolas.werner@hotmail.de>
This commit is contained in:
parent
63c0e9e195
commit
560f3b8609
6 changed files with 181 additions and 1 deletions
|
@ -17,6 +17,10 @@ from typing import Any, Dict, Iterable, List, Optional, Tuple
|
|||
from synapse.storage._base import SQLBaseStore
|
||||
from synapse.storage.database import DatabasePool
|
||||
|
||||
BG_UPDATE_REMOVE_MEDIA_REPO_INDEX_WITHOUT_METHOD = (
|
||||
"media_repository_drop_index_wo_method"
|
||||
)
|
||||
|
||||
|
||||
class MediaRepositoryBackgroundUpdateStore(SQLBaseStore):
|
||||
def __init__(self, database: DatabasePool, db_conn, hs):
|
||||
|
@ -32,6 +36,59 @@ class MediaRepositoryBackgroundUpdateStore(SQLBaseStore):
|
|||
where_clause="url_cache IS NOT NULL",
|
||||
)
|
||||
|
||||
# The following the updates add the method to the unique constraint of
|
||||
# the thumbnail databases. That fixes an issue, where thumbnails of the
|
||||
# same resolution, but different methods could overwrite one another.
|
||||
# This can happen with custom thumbnail configs or with dynamic thumbnailing.
|
||||
self.db_pool.updates.register_background_index_update(
|
||||
update_name="local_media_repository_thumbnails_method_idx",
|
||||
index_name="local_media_repository_thumbn_media_id_width_height_method_key",
|
||||
table="local_media_repository_thumbnails",
|
||||
columns=[
|
||||
"media_id",
|
||||
"thumbnail_width",
|
||||
"thumbnail_height",
|
||||
"thumbnail_type",
|
||||
"thumbnail_method",
|
||||
],
|
||||
unique=True,
|
||||
)
|
||||
|
||||
self.db_pool.updates.register_background_index_update(
|
||||
update_name="remote_media_repository_thumbnails_method_idx",
|
||||
index_name="remote_media_repository_thumbn_media_origin_id_width_height_method_key",
|
||||
table="remote_media_cache_thumbnails",
|
||||
columns=[
|
||||
"media_origin",
|
||||
"media_id",
|
||||
"thumbnail_width",
|
||||
"thumbnail_height",
|
||||
"thumbnail_type",
|
||||
"thumbnail_method",
|
||||
],
|
||||
unique=True,
|
||||
)
|
||||
|
||||
self.db_pool.updates.register_background_update_handler(
|
||||
BG_UPDATE_REMOVE_MEDIA_REPO_INDEX_WITHOUT_METHOD,
|
||||
self._drop_media_index_without_method,
|
||||
)
|
||||
|
||||
async def _drop_media_index_without_method(self, progress, batch_size):
|
||||
def f(txn):
|
||||
txn.execute(
|
||||
"ALTER TABLE local_media_repository_thumbnails DROP CONSTRAINT IF EXISTS local_media_repository_thumbn_media_id_thumbnail_width_thum_key"
|
||||
)
|
||||
txn.execute(
|
||||
"ALTER TABLE remote_media_cache_thumbnails DROP CONSTRAINT IF EXISTS remote_media_repository_thumbn_media_id_thumbnail_width_thum_key"
|
||||
)
|
||||
|
||||
await self.db_pool.runInteraction("drop_media_indices_without_method", f)
|
||||
await self.db_pool.updates._end_background_update(
|
||||
BG_UPDATE_REMOVE_MEDIA_REPO_INDEX_WITHOUT_METHOD
|
||||
)
|
||||
return 1
|
||||
|
||||
|
||||
class MediaRepositoryStore(MediaRepositoryBackgroundUpdateStore):
|
||||
"""Persistence for attachments and avatars"""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue