mirror of
				https://github.com/matrix-org/synapse.git
				synced 2025-11-04 10:11:05 +01:00 
			
		
		
		
	Merge pull request #2701 from matrix-org/rav/one_mediarepo_to_rule_them_all
Try to avoid having multiple PreviewUrlResource instances
This commit is contained in:
		
						commit
						79eba878a7
					
				@ -170,6 +170,10 @@ Handles the media repository. It can handle all endpoints starting with::
 | 
			
		||||
 | 
			
		||||
    /_matrix/media/
 | 
			
		||||
 | 
			
		||||
You should also set ``enable_media_repo: False`` in the shared configuration
 | 
			
		||||
file to stop the main synapse running background jobs related to managing the
 | 
			
		||||
media repository.
 | 
			
		||||
 | 
			
		||||
Note this worker cannot be load-balanced: only one instance should be active.
 | 
			
		||||
 | 
			
		||||
``synapse.app.client_reader``
 | 
			
		||||
@ -203,4 +207,3 @@ the ``worker_main_http_uri`` setting in the frontend_proxy worker configuration
 | 
			
		||||
file. For example::
 | 
			
		||||
 | 
			
		||||
    worker_main_http_uri: http://127.0.0.1:8008
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,6 @@ from synapse.rest import ClientRestResource
 | 
			
		||||
from synapse.rest.key.v1.server_key_resource import LocalKey
 | 
			
		||||
from synapse.rest.key.v2 import KeyApiV2Resource
 | 
			
		||||
from synapse.rest.media.v0.content_repository import ContentRepoResource
 | 
			
		||||
from synapse.rest.media.v1.media_repository import MediaRepositoryResource
 | 
			
		||||
from synapse.server import HomeServer
 | 
			
		||||
from synapse.storage import are_all_users_on_domain
 | 
			
		||||
from synapse.storage.engines import IncorrectDatabaseSetup, create_engine
 | 
			
		||||
@ -195,7 +194,8 @@ class SynapseHomeServer(HomeServer):
 | 
			
		||||
            })
 | 
			
		||||
 | 
			
		||||
        if name in ["media", "federation", "client"]:
 | 
			
		||||
            media_repo = MediaRepositoryResource(self)
 | 
			
		||||
            if self.get_config().enable_media_repo:
 | 
			
		||||
                media_repo = self.get_media_repository_resource()
 | 
			
		||||
                resources.update({
 | 
			
		||||
                    MEDIA_PREFIX: media_repo,
 | 
			
		||||
                    LEGACY_MEDIA_PREFIX: media_repo,
 | 
			
		||||
@ -203,6 +203,10 @@ class SynapseHomeServer(HomeServer):
 | 
			
		||||
                        self, self.config.uploads_path
 | 
			
		||||
                    ),
 | 
			
		||||
                })
 | 
			
		||||
            elif name == "media":
 | 
			
		||||
                raise ConfigError(
 | 
			
		||||
                    "'media' resource conflicts with enable_media_repo=False",
 | 
			
		||||
                )
 | 
			
		||||
 | 
			
		||||
        if name in ["keys", "federation"]:
 | 
			
		||||
            resources.update({
 | 
			
		||||
 | 
			
		||||
@ -35,7 +35,6 @@ from synapse.replication.slave.storage.registration import SlavedRegistrationSto
 | 
			
		||||
from synapse.replication.slave.storage.transactions import TransactionStore
 | 
			
		||||
from synapse.replication.tcp.client import ReplicationClientHandler
 | 
			
		||||
from synapse.rest.media.v0.content_repository import ContentRepoResource
 | 
			
		||||
from synapse.rest.media.v1.media_repository import MediaRepositoryResource
 | 
			
		||||
from synapse.server import HomeServer
 | 
			
		||||
from synapse.storage.engines import create_engine
 | 
			
		||||
from synapse.storage.media_repository import MediaRepositoryStore
 | 
			
		||||
@ -89,7 +88,7 @@ class MediaRepositoryServer(HomeServer):
 | 
			
		||||
                if name == "metrics":
 | 
			
		||||
                    resources[METRICS_PREFIX] = MetricsResource(self)
 | 
			
		||||
                elif name == "media":
 | 
			
		||||
                    media_repo = MediaRepositoryResource(self)
 | 
			
		||||
                    media_repo = self.get_media_repository_resource()
 | 
			
		||||
                    resources.update({
 | 
			
		||||
                        MEDIA_PREFIX: media_repo,
 | 
			
		||||
                        LEGACY_MEDIA_PREFIX: media_repo,
 | 
			
		||||
@ -151,6 +150,13 @@ def start(config_options):
 | 
			
		||||
 | 
			
		||||
    assert config.worker_app == "synapse.app.media_repository"
 | 
			
		||||
 | 
			
		||||
    if config.enable_media_repo:
 | 
			
		||||
        _base.quit_with_error(
 | 
			
		||||
            "enable_media_repo must be disabled in the main synapse process\n"
 | 
			
		||||
            "before the media repo can be run in a separate worker.\n"
 | 
			
		||||
            "Please add ``enable_media_repo: false`` to the main config\n"
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    setup_logging(config, use_worker_options=True)
 | 
			
		||||
 | 
			
		||||
    events.USE_FROZEN_DICTS = config.use_frozen_dicts
 | 
			
		||||
 | 
			
		||||
@ -41,6 +41,12 @@ class ServerConfig(Config):
 | 
			
		||||
        # false only if we are updating the user directory in a worker
 | 
			
		||||
        self.update_user_directory = config.get("update_user_directory", True)
 | 
			
		||||
 | 
			
		||||
        # whether to enable the media repository endpoints. This should be set
 | 
			
		||||
        # to false if the media repository is running as a separate endpoint;
 | 
			
		||||
        # doing so ensures that we will not run cache cleanup jobs on the
 | 
			
		||||
        # master, potentially causing inconsistency.
 | 
			
		||||
        self.enable_media_repo = config.get("enable_media_repo", True)
 | 
			
		||||
 | 
			
		||||
        self.filter_timeline_limit = config.get("filter_timeline_limit", -1)
 | 
			
		||||
 | 
			
		||||
        # Whether we should block invites sent to users on this server
 | 
			
		||||
 | 
			
		||||
@ -60,7 +60,10 @@ from synapse.http.matrixfederationclient import MatrixFederationHttpClient
 | 
			
		||||
from synapse.notifier import Notifier
 | 
			
		||||
from synapse.push.action_generator import ActionGenerator
 | 
			
		||||
from synapse.push.pusherpool import PusherPool
 | 
			
		||||
from synapse.rest.media.v1.media_repository import MediaRepository
 | 
			
		||||
from synapse.rest.media.v1.media_repository import (
 | 
			
		||||
    MediaRepository,
 | 
			
		||||
    MediaRepositoryResource,
 | 
			
		||||
)
 | 
			
		||||
from synapse.state import StateHandler
 | 
			
		||||
from synapse.storage import DataStore
 | 
			
		||||
from synapse.streams.events import EventSources
 | 
			
		||||
@ -121,6 +124,7 @@ class HomeServer(object):
 | 
			
		||||
        'http_client_context_factory',
 | 
			
		||||
        'simple_http_client',
 | 
			
		||||
        'media_repository',
 | 
			
		||||
        'media_repository_resource',
 | 
			
		||||
        'federation_transport_client',
 | 
			
		||||
        'federation_sender',
 | 
			
		||||
        'receipts_handler',
 | 
			
		||||
@ -293,6 +297,11 @@ class HomeServer(object):
 | 
			
		||||
            **self.db_config.get("args", {})
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def build_media_repository_resource(self):
 | 
			
		||||
        # build the media repo resource. This indirects through the HomeServer
 | 
			
		||||
        # to ensure that we only have a single instance of
 | 
			
		||||
        return MediaRepositoryResource(self)
 | 
			
		||||
 | 
			
		||||
    def build_media_repository(self):
 | 
			
		||||
        return MediaRepository(self)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -5,6 +5,7 @@ import synapse.handlers
 | 
			
		||||
import synapse.handlers.auth
 | 
			
		||||
import synapse.handlers.device
 | 
			
		||||
import synapse.handlers.e2e_keys
 | 
			
		||||
import synapse.rest.media.v1.media_repository
 | 
			
		||||
import synapse.storage
 | 
			
		||||
import synapse.state
 | 
			
		||||
 | 
			
		||||
@ -35,3 +36,9 @@ class HomeServer(object):
 | 
			
		||||
 | 
			
		||||
    def get_federation_transport_client(self) -> synapse.federation.transport.client.TransportLayerClient:
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    def get_media_repository_resource(self) -> synapse.rest.media.v1.media_repository.MediaRepositoryResource:
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    def get_media_repository(self) -> synapse.rest.media.v1.media_repository.MediaRepository:
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user