Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Merge pull request #2701 from matrix-org/rav/one_mediarepo_to_rule_th…
Browse files Browse the repository at this point in the history
…em_all

Try to avoid having multiple PreviewUrlResource instances
  • Loading branch information
richvdh authored Nov 22, 2017
2 parents 148c113 + 68ca864 commit 79eba87
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 13 deletions.
5 changes: 4 additions & 1 deletion docs/workers.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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``
Expand Down Expand Up @@ -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

22 changes: 13 additions & 9 deletions synapse/app/homeserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@
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
Expand Down Expand Up @@ -195,14 +194,19 @@ def _configure_named_resource(self, name, compress=False):
})

if name in ["media", "federation", "client"]:
media_repo = MediaRepositoryResource(self)
resources.update({
MEDIA_PREFIX: media_repo,
LEGACY_MEDIA_PREFIX: media_repo,
CONTENT_REPO_PREFIX: ContentRepoResource(
self, self.config.uploads_path
),
})
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,
CONTENT_REPO_PREFIX: ContentRepoResource(
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({
Expand Down
10 changes: 8 additions & 2 deletions synapse/app/media_repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
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
Expand Down Expand Up @@ -89,7 +88,7 @@ def _listen_http(self, listener_config):
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,
Expand Down Expand Up @@ -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
Expand Down
6 changes: 6 additions & 0 deletions synapse/config/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,12 @@ def read_config(self, 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
Expand Down
11 changes: 10 additions & 1 deletion synapse/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,10 @@
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
Expand Down Expand Up @@ -121,6 +124,7 @@ def build_DEPENDENCY(self)
'http_client_context_factory',
'simple_http_client',
'media_repository',
'media_repository_resource',
'federation_transport_client',
'federation_sender',
'receipts_handler',
Expand Down Expand Up @@ -293,6 +297,11 @@ def build_db_pool(self):
**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)

Expand Down
7 changes: 7 additions & 0 deletions synapse/server.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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

0 comments on commit 79eba87

Please sign in to comment.