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

Allow passing --daemonize to workers #4853

Merged
merged 3 commits into from
Mar 15, 2019
Merged
Show file tree
Hide file tree
Changes from all 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/4853.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Allow passing --daemonize flags to workers in the same way as with master.
18 changes: 12 additions & 6 deletions synapse/app/_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,12 +63,13 @@ def start_worker_reactor(appname, config):

start_reactor(
appname,
config.soft_file_limit,
config.gc_thresholds,
config.worker_pid_file,
config.worker_daemonize,
config.worker_cpu_affinity,
logger,
soft_file_limit=config.soft_file_limit,
gc_thresholds=config.gc_thresholds,
pid_file=config.worker_pid_file,
daemonize=config.worker_daemonize,
cpu_affinity=config.worker_cpu_affinity,
print_pidfile=config.print_pidfile,
logger=logger,
)


Expand All @@ -79,6 +80,7 @@ def start_reactor(
pid_file,
daemonize,
cpu_affinity,
print_pidfile,
logger,
):
""" Run the reactor in the main process
Expand All @@ -93,6 +95,7 @@ def start_reactor(
pid_file (str): name of pid file to write to if daemonize is True
daemonize (bool): true to run the reactor in a background process
cpu_affinity (int|None): cpu affinity mask
print_pidfile (bool): whether to print the pid file, if daemonize is True
logger (logging.Logger): logger instance to pass to Daemonize
"""

Expand Down Expand Up @@ -124,6 +127,9 @@ def run():
reactor.run()

if daemonize:
if print_pidfile:
print(pid_file)

daemon = Daemonize(
app=appname,
pid=pid_file,
Expand Down
16 changes: 7 additions & 9 deletions synapse/app/homeserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -636,17 +636,15 @@ def start_generate_monthly_active_users():
# be quite busy the first few minutes
clock.call_later(5 * 60, start_phone_stats_home)

if hs.config.daemonize and hs.config.print_pidfile:
print(hs.config.pid_file)

_base.start_reactor(
"synapse-homeserver",
hs.config.soft_file_limit,
hs.config.gc_thresholds,
hs.config.pid_file,
hs.config.daemonize,
hs.config.cpu_affinity,
logger,
soft_file_limit=hs.config.soft_file_limit,
gc_thresholds=hs.config.gc_thresholds,
pid_file=hs.config.pid_file,
daemonize=hs.config.daemonize,
cpu_affinity=hs.config.cpu_affinity,
print_pidfile=hs.config.print_pidfile,
logger=logger,
)


Expand Down
8 changes: 7 additions & 1 deletion synapse/config/_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,14 +214,20 @@ def load_config(cls, description, argv):
" Defaults to the directory containing the last config file",
)

obj = cls()

obj.invoke_all("add_arguments", config_parser)

config_args = config_parser.parse_args(argv)

config_files = find_config_files(search_paths=config_args.config_path)

obj = cls()
obj.read_config_files(
config_files, keys_directory=config_args.keys_directory, generate_keys=False
)

obj.invoke_all("read_arguments", config_args)

return obj

@classmethod
Expand Down
28 changes: 27 additions & 1 deletion synapse/config/workers.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def read_config(self, config):
if self.worker_app == "synapse.app.homeserver":
self.worker_app = None

self.worker_listeners = config.get("worker_listeners")
self.worker_listeners = config.get("worker_listeners", [])
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this looks like it will fix #4783 ?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ooh, yes!

self.worker_daemonize = config.get("worker_daemonize")
self.worker_pid_file = config.get("worker_pid_file")
self.worker_log_file = config.get("worker_log_file")
Expand All @@ -48,6 +48,17 @@ def read_config(self, config):
self.worker_main_http_uri = config.get("worker_main_http_uri", None)
self.worker_cpu_affinity = config.get("worker_cpu_affinity")

# This option is really only here to support `--manhole` command line
# argument.
manhole = config.get("worker_manhole")
if manhole:
self.worker_listeners.append({
"port": manhole,
"bind_addresses": ["127.0.0.1"],
"type": "manhole",
"tls": False,
})

if self.worker_listeners:
for listener in self.worker_listeners:
bind_address = listener.pop("bind_address", None)
Expand All @@ -57,3 +68,18 @@ def read_config(self, config):
bind_addresses.append(bind_address)
elif not bind_addresses:
bind_addresses.append('')

def read_arguments(self, args):
# We support a bunch of command line arguments that override options in
# the config. A lot of these options have a worker_* prefix when running
# on workers so we also have to override them when command line options
# are specified.

if args.daemonize is not None:
self.worker_daemonize = args.daemonize
if args.log_config is not None:
self.worker_log_config = args.log_config
if args.log_file is not None:
self.worker_log_file = args.log_file
if args.manhole is not None:
self.worker_manhole = args.worker_manhole