From 82be4457deeab9cc4e21ffebfec78bb2bac2e5b1 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Wed, 7 Jan 2015 13:46:37 +0000 Subject: [PATCH 1/3] Add twisted Service interface --- synapse/app/homeserver.py | 21 ++++++++++++++++++--- synapse/storage/_base.py | 1 + 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index 5fec8da7ca..e99153988f 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -19,6 +19,7 @@ from synapse.storage import prepare_database, UpgradeDatabaseException from synapse.server import HomeServer from twisted.internet import reactor +from twisted.application import service from twisted.enterprise import adbapi from twisted.web.resource import Resource from twisted.web.static import File @@ -189,10 +190,10 @@ class SynapseHomeServer(HomeServer): logger.info("Synapse now listening on port %d", unsecure_port) -def setup(): +def setup(config_options, should_run=True): config = HomeServerConfig.load_config( "Synapse Homeserver", - sys.argv[1:], + config_options, generate_section="Homeserver" ) @@ -254,6 +255,9 @@ def setup(): bind_port = None hs.start_listening(bind_port, config.unsecure_port) + if not should_run: + return + if config.daemonize: print config.pid_file daemon = Daemonize( @@ -270,6 +274,17 @@ def setup(): reactor.run() +class SynapseService(service.Service): + def __init__(self, config): + self.config = config + + def startService(self): + setup(self.config, should_run=False) + + def stopService(self): + return self._port.stopListening() + + def run(): with LoggingContext("run"): reactor.run() @@ -277,7 +292,7 @@ def run(): def main(): with LoggingContext("main"): - setup() + setup(sys.argv[1:]) if __name__ == '__main__': diff --git a/synapse/storage/_base.py b/synapse/storage/_base.py index f660fc6eaf..ce63f12008 100644 --- a/synapse/storage/_base.py +++ b/synapse/storage/_base.py @@ -95,6 +95,7 @@ class SQLBaseStore(object): current_context.copy_to(context) start = time.time() * 1000 txn_id = SQLBaseStore._TXN_ID + SQLBaseStore._TXN_ID += 1 # We don't really need these to be unique, so lets stop it from # growing really large. From b8a6692657d350389f1c3dc8bd903110c2ae1d72 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Tue, 10 Mar 2015 09:39:42 +0000 Subject: [PATCH 2/3] Add documentation. When starting via twistd respect soft_file_limit config option. --- synapse/app/homeserver.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index dff08c8bc5..26ef02e3de 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -297,6 +297,15 @@ def change_resource_limit(soft_file_no): def setup(config_options, should_run=True): + """ + Args: + config_options_options: The options passed to Synapse. Usually + `sys.argv[1:]`. + should_run (bool): Whether to start the reactor. + + Returns: + HomeServer + """ config = HomeServerConfig.load_config( "Synapse Homeserver", config_options, @@ -372,7 +381,7 @@ def setup(config_options, should_run=True): hs.get_replication_layer().start_get_pdu_cache() if not should_run: - return + return hs if config.daemonize: print config.pid_file @@ -390,13 +399,19 @@ def setup(config_options, should_run=True): else: run(config) + return hs + class SynapseService(service.Service): + """A twisted Service class that will start synapse. Used to run synapse + via twistd and a .tac. + """ def __init__(self, config): self.config = config def startService(self): - setup(self.config, should_run=False) + hs = setup(self.config, should_run=False) + change_resource_limit(hs.config.soft_file_limit) def stopService(self): return self._port.stopListening() From c37eceeb9ef2514237468a7f5e3e6e07d293de16 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Tue, 10 Mar 2015 09:58:33 +0000 Subject: [PATCH 3/3] Split out the 'run' from 'setup' --- synapse/app/homeserver.py | 53 ++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index 26ef02e3de..e84b9ef5b3 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -296,7 +296,7 @@ def change_resource_limit(soft_file_no): logger.warn("Failed to set file limit: %s", e) -def setup(config_options, should_run=True): +def setup(config_options): """ Args: config_options_options: The options passed to Synapse. Usually @@ -380,25 +380,6 @@ def setup(config_options, should_run=True): hs.get_datastore().start_profiling() hs.get_replication_layer().start_get_pdu_cache() - if not should_run: - return hs - - if config.daemonize: - print config.pid_file - - daemon = Daemonize( - app="synapse-homeserver", - pid=config.pid_file, - action=lambda: run(config), - auto_close_fds=False, - verbose=True, - logger=logger, - ) - - daemon.start() - else: - run(config) - return hs @@ -410,24 +391,44 @@ class SynapseService(service.Service): self.config = config def startService(self): - hs = setup(self.config, should_run=False) + hs = setup(self.config) change_resource_limit(hs.config.soft_file_limit) def stopService(self): return self._port.stopListening() -def run(config): - with LoggingContext("run"): - change_resource_limit(config.soft_file_limit) +def run(hs): - reactor.run() + def in_thread(): + with LoggingContext("run"): + change_resource_limit(hs.config.soft_file_limit) + + reactor.run() + + if hs.config.daemonize: + + print hs.config.pid_file + + daemon = Daemonize( + app="synapse-homeserver", + pid=hs.config.pid_file, + action=lambda: in_thread(), + auto_close_fds=False, + verbose=True, + logger=logger, + ) + + daemon.start() + else: + in_thread(hs.config) def main(): with LoggingContext("main"): check_requirements() - setup(sys.argv[1:]) + hs = setup(sys.argv[1:]) + run(hs) if __name__ == '__main__':