Give appropriate exit codes when synctl fails (#5992)

This commit is contained in:
Jorik Schellekens 2019-09-18 22:27:59 +01:00 committed by Richard van der Hoff
parent a86a290850
commit d58cad635e
2 changed files with 40 additions and 4 deletions

1
changelog.d/5992.feature Normal file
View file

@ -0,0 +1 @@
Give appropriate exit codes when synctl fails.

43
synctl
View file

@ -71,7 +71,20 @@ def abort(message, colour=RED, stream=sys.stderr):
sys.exit(1) sys.exit(1)
def start(configfile, daemonize=True): def start(configfile: str, daemonize: bool = True) -> bool:
"""Attempts to start synapse.
Args:
configfile: path to a yaml synapse config file
daemonize: whether to daemonize synapse or keep it attached to the current
session
Returns:
True if the process started successfully
False if there was an error starting the process
If deamonize is False it will only return once synapse exits.
"""
write("Starting ...") write("Starting ...")
args = SYNAPSE args = SYNAPSE
@ -83,25 +96,40 @@ def start(configfile, daemonize=True):
try: try:
subprocess.check_call(args) subprocess.check_call(args)
write("started synapse.app.homeserver(%r)" % (configfile,), colour=GREEN) write("started synapse.app.homeserver(%r)" % (configfile,), colour=GREEN)
return True
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
write( write(
"error starting (exit code: %d); see above for logs" % e.returncode, "error starting (exit code: %d); see above for logs" % e.returncode,
colour=RED, colour=RED,
) )
return False
def start_worker(app, configfile, worker_configfile): def start_worker(app: str, configfile: str, worker_configfile: str) -> bool:
"""Attempts to start a synapse worker.
Args:
app: name of the worker's appservice
configfile: path to a yaml synapse config file
worker_configfile: path to worker specific yaml synapse file
Returns:
True if the process started successfully
False if there was an error starting the process
"""
args = [sys.executable, "-B", "-m", app, "-c", configfile, "-c", worker_configfile] args = [sys.executable, "-B", "-m", app, "-c", configfile, "-c", worker_configfile]
try: try:
subprocess.check_call(args) subprocess.check_call(args)
write("started %s(%r)" % (app, worker_configfile), colour=GREEN) write("started %s(%r)" % (app, worker_configfile), colour=GREEN)
return True
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
write( write(
"error starting %s(%r) (exit code: %d); see above for logs" "error starting %s(%r) (exit code: %d); see above for logs"
% (app, worker_configfile, e.returncode), % (app, worker_configfile, e.returncode),
colour=RED, colour=RED,
) )
return False
def stop(pidfile, app): def stop(pidfile, app):
@ -292,11 +320,14 @@ def main():
write("All processes exited; now restarting...") write("All processes exited; now restarting...")
if action == "start" or action == "restart": if action == "start" or action == "restart":
error = False
if start_stop_synapse: if start_stop_synapse:
# Check if synapse is already running # Check if synapse is already running
if os.path.exists(pidfile) and pid_running(int(open(pidfile).read())): if os.path.exists(pidfile) and pid_running(int(open(pidfile).read())):
abort("synapse.app.homeserver already running") abort("synapse.app.homeserver already running")
start(configfile, bool(options.daemonize))
if not start(configfile, bool(options.daemonize)):
error = True
for worker in workers: for worker in workers:
env = os.environ.copy() env = os.environ.copy()
@ -307,12 +338,16 @@ def main():
for cache_name, factor in iteritems(worker.cache_factors): for cache_name, factor in iteritems(worker.cache_factors):
os.environ["SYNAPSE_CACHE_FACTOR_" + cache_name.upper()] = str(factor) os.environ["SYNAPSE_CACHE_FACTOR_" + cache_name.upper()] = str(factor)
start_worker(worker.app, configfile, worker.configfile) if not start_worker(worker.app, configfile, worker.configfile):
error = True
# Reset env back to the original # Reset env back to the original
os.environ.clear() os.environ.clear()
os.environ.update(env) os.environ.update(env)
if error:
exit(1)
if __name__ == "__main__": if __name__ == "__main__":
main() main()