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

Deduplicate some code in synapse.app #4567

Merged
merged 10 commits into from
Feb 8, 2019
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/4567.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Reduce duplication of ``synapse.app`` code.
61 changes: 61 additions & 0 deletions synapse/app/_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,26 @@

import gc
import logging
import signal
import sys
import traceback

import psutil
from daemonize import Daemonize

from twisted.internet import error, reactor
from twisted.protocols.tls import TLSMemoryBIOFactory

from synapse.app import check_bind_error
from synapse.crypto import context_factory
from synapse.util import PreserveLoggingContext
from synapse.util.rlimit import change_resource_limit

logger = logging.getLogger(__name__)

_sighup_callbacks = []
register_sighup = _sighup_callbacks.append
hawkowl marked this conversation as resolved.
Show resolved Hide resolved


def start_worker_reactor(appname, config):
""" Run the reactor in the main process
Expand Down Expand Up @@ -189,3 +196,57 @@ def listen_ssl(

logger.info("Synapse now listening on port %d (TLS)", port)
return r


def refresh_certificate(hs):
"""
Refresh the TLS certificates that Synapse is using by re-reading them from
disk and updating the TLS context factories to use them.
"""
logging.info("Loading certificate from disk...")
hs.config.read_certificate_from_disk()
hs.tls_server_context_factory = context_factory.ServerContextFactory(hs.config)
hs.tls_client_options_factory = context_factory.ClientTLSOptionsFactory(
hs.config
)
logging.info("Certificate loaded.")

if hs._listening_services:
hawkowl marked this conversation as resolved.
Show resolved Hide resolved
logging.info("Updating context factories...")
for i in hs._listening_services:
if isinstance(i.factory, TLSMemoryBIOFactory):
i.factory = TLSMemoryBIOFactory(
hs.tls_server_context_factory,
False,
i.factory.wrappedFactory
)
logging.info("Context factories updated.")


def start(hs, listeners=None):
"""
Start a Synapse server or worker.
hawkowl marked this conversation as resolved.
Show resolved Hide resolved
"""
try:
# Set up the SIGHUP machinery.
if hasattr(signal, "SIGHUP"):
def handle_sighup(*args, **kwargs):
for i in _sighup_callbacks:
i(hs)

signal.signal(signal.SIGHUP, handle_sighup)

register_sighup(refresh_certificate)

# Load the certificate from disk.
refresh_certificate(hs)

# It is now safe to start your Synapse.
hs.start_listening(listeners)
hs.get_datastore().start_profiling()
except Exception:
traceback.print_exc(file=sys.stderr)
reactor = hs.get_reactor()
if reactor.running:
reactor.stop()
sys.exit(1)
7 changes: 1 addition & 6 deletions synapse/app/appservice.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,12 +168,7 @@ def start(config_options):
)

ps.setup()
ps.start_listening(config.worker_listeners)

def start():
ps.get_datastore().start_profiling()

reactor.callWhenRunning(start)
reactor.callWhenRunning(_base.start, ps, config.worker_listeners)

_base.start_worker_reactor("synapse-appservice", config)

Expand Down
13 changes: 1 addition & 12 deletions synapse/app/client_reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
from synapse.config._base import ConfigError
from synapse.config.homeserver import HomeServerConfig
from synapse.config.logger import setup_logging
from synapse.crypto import context_factory
from synapse.http.server import JsonResource
from synapse.http.site import SynapseSite
from synapse.metrics import RegistryProxy
Expand Down Expand Up @@ -173,17 +172,7 @@ def start(config_options):
)

ss.setup()

def start():
ss.config.read_certificate_from_disk()
ss.tls_server_context_factory = context_factory.ServerContextFactory(config)
ss.tls_client_options_factory = context_factory.ClientTLSOptionsFactory(
config
)
ss.start_listening(config.worker_listeners)
ss.get_datastore().start_profiling()

reactor.callWhenRunning(start)
reactor.callWhenRunning(_base.start, ss, config.worker_listeners)

_base.start_worker_reactor("synapse-client-reader", config)

Expand Down
13 changes: 1 addition & 12 deletions synapse/app/event_creator.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
from synapse.config._base import ConfigError
from synapse.config.homeserver import HomeServerConfig
from synapse.config.logger import setup_logging
from synapse.crypto import context_factory
from synapse.http.server import JsonResource
from synapse.http.site import SynapseSite
from synapse.metrics import RegistryProxy
Expand Down Expand Up @@ -194,17 +193,7 @@ def start(config_options):
)

ss.setup()

def start():
ss.config.read_certificate_from_disk()
ss.tls_server_context_factory = context_factory.ServerContextFactory(config)
ss.tls_client_options_factory = context_factory.ClientTLSOptionsFactory(
config
)
ss.start_listening(config.worker_listeners)
ss.get_datastore().start_profiling()

reactor.callWhenRunning(start)
reactor.callWhenRunning(_base.start, ss, config.worker_listeners)

_base.start_worker_reactor("synapse-event-creator", config)

Expand Down
13 changes: 1 addition & 12 deletions synapse/app/federation_reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
from synapse.config._base import ConfigError
from synapse.config.homeserver import HomeServerConfig
from synapse.config.logger import setup_logging
from synapse.crypto import context_factory
from synapse.federation.transport.server import TransportLayerServer
from synapse.http.site import SynapseSite
from synapse.metrics import RegistryProxy
Expand Down Expand Up @@ -160,17 +159,7 @@ def start(config_options):
)

ss.setup()

def start():
ss.config.read_certificate_from_disk()
ss.tls_server_context_factory = context_factory.ServerContextFactory(config)
ss.tls_client_options_factory = context_factory.ClientTLSOptionsFactory(
config
)
ss.start_listening(config.worker_listeners)
ss.get_datastore().start_profiling()

reactor.callWhenRunning(start)
reactor.callWhenRunning(_base.start, ss, config.worker_listeners)

_base.start_worker_reactor("synapse-federation-reader", config)

Expand Down
12 changes: 1 addition & 11 deletions synapse/app/federation_sender.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
from synapse.config._base import ConfigError
from synapse.config.homeserver import HomeServerConfig
from synapse.config.logger import setup_logging
from synapse.crypto import context_factory
from synapse.federation import send_queue
from synapse.http.site import SynapseSite
from synapse.metrics import RegistryProxy
Expand Down Expand Up @@ -192,17 +191,8 @@ def start(config_options):
)

ss.setup()
reactor.callWhenRunning(_base.start, ss, config.worker_listeners)

def start():
ss.config.read_certificate_from_disk()
ss.tls_server_context_factory = context_factory.ServerContextFactory(config)
ss.tls_client_options_factory = context_factory.ClientTLSOptionsFactory(
config
)
ss.start_listening(config.worker_listeners)
ss.get_datastore().start_profiling()

reactor.callWhenRunning(start)
_base.start_worker_reactor("synapse-federation-sender", config)


Expand Down
13 changes: 1 addition & 12 deletions synapse/app/frontend_proxy.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
from synapse.config._base import ConfigError
from synapse.config.homeserver import HomeServerConfig
from synapse.config.logger import setup_logging
from synapse.crypto import context_factory
from synapse.http.server import JsonResource
from synapse.http.servlet import RestServlet, parse_json_object_from_request
from synapse.http.site import SynapseSite
Expand Down Expand Up @@ -250,17 +249,7 @@ def start(config_options):
)

ss.setup()

def start():
ss.config.read_certificate_from_disk()
ss.tls_server_context_factory = context_factory.ServerContextFactory(config)
ss.tls_client_options_factory = context_factory.ClientTLSOptionsFactory(
config
)
ss.start_listening(config.worker_listeners)
ss.get_datastore().start_profiling()

reactor.callWhenRunning(start)
reactor.callWhenRunning(_base.start, ss, config.worker_listeners)

_base.start_worker_reactor("synapse-frontend-proxy", config)

Expand Down
14 changes: 1 addition & 13 deletions synapse/app/homeserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import gc
import logging
import os
import signal
import sys
import traceback

Expand Down Expand Up @@ -328,20 +327,11 @@ def setup(config_options):
# generating config files and shouldn't try to continue.
sys.exit(0)

sighup_callbacks = []
synapse.config.logger.setup_logging(
config,
use_worker_options=False,
register_sighup=sighup_callbacks.append
use_worker_options=False
)

def handle_sighup(*args, **kwargs):
for i in sighup_callbacks:
i(*args, **kwargs)

if hasattr(signal, "SIGHUP"):
hawkowl marked this conversation as resolved.
Show resolved Hide resolved
signal.signal(signal.SIGHUP, handle_sighup)

events.USE_FROZEN_DICTS = config.use_frozen_dicts

database_engine = create_engine(config.database_config)
Expand Down Expand Up @@ -400,8 +390,6 @@ def refresh_certificate(*args):
)
logging.info("Context factories updated.")

sighup_callbacks.append(refresh_certificate)
hawkowl marked this conversation as resolved.
Show resolved Hide resolved

@defer.inlineCallbacks
def start():
try:
Expand Down
13 changes: 1 addition & 12 deletions synapse/app/media_repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
from synapse.config._base import ConfigError
from synapse.config.homeserver import HomeServerConfig
from synapse.config.logger import setup_logging
from synapse.crypto import context_factory
from synapse.http.site import SynapseSite
from synapse.metrics import RegistryProxy
from synapse.metrics.resource import METRICS_PREFIX, MetricsResource
Expand Down Expand Up @@ -160,17 +159,7 @@ def start(config_options):
)

ss.setup()

def start():
ss.config.read_certificate_from_disk()
ss.tls_server_context_factory = context_factory.ServerContextFactory(config)
ss.tls_client_options_factory = context_factory.ClientTLSOptionsFactory(
config
)
ss.start_listening(config.worker_listeners)
ss.get_datastore().start_profiling()

reactor.callWhenRunning(start)
reactor.callWhenRunning(_base.start, ss, config.worker_listeners)

_base.start_worker_reactor("synapse-media-repository", config)

Expand Down
3 changes: 1 addition & 2 deletions synapse/app/pusher.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,11 +224,10 @@ def start(config_options):
)

ps.setup()
ps.start_listening(config.worker_listeners)

def start():
_base.start(ps, config.worker_listeners)
ps.get_pusherpool().start()
ps.get_datastore().start_profiling()

reactor.callWhenRunning(start)

Expand Down
7 changes: 1 addition & 6 deletions synapse/app/synchrotron.py
Original file line number Diff line number Diff line change
Expand Up @@ -445,12 +445,7 @@ def start(config_options):
)

ss.setup()
ss.start_listening(config.worker_listeners)

def start():
ss.get_datastore().start_profiling()

reactor.callWhenRunning(start)
reactor.callWhenRunning(_base.start, ss, config.worker_listeners)

_base.start_worker_reactor("synapse-synchrotron", config)

Expand Down
13 changes: 1 addition & 12 deletions synapse/app/user_dir.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
from synapse.config._base import ConfigError
from synapse.config.homeserver import HomeServerConfig
from synapse.config.logger import setup_logging
from synapse.crypto import context_factory
from synapse.http.server import JsonResource
from synapse.http.site import SynapseSite
from synapse.metrics import RegistryProxy
Expand Down Expand Up @@ -220,17 +219,7 @@ def start(config_options):
)

ss.setup()

def start():
ss.config.read_certificate_from_disk()
ss.tls_server_context_factory = context_factory.ServerContextFactory(config)
ss.tls_client_options_factory = context_factory.ClientTLSOptionsFactory(
config
)
ss.start_listening(config.worker_listeners)
ss.get_datastore().start_profiling()

reactor.callWhenRunning(start)
reactor.callWhenRunning(_base.start, ss, config.worker_listeners)

_base.start_worker_reactor("synapse-user-dir", config)

Expand Down
Loading