From d6b3cfd855c0eebed68be50d3111de1b5a6afeb0 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Thu, 13 Jun 2013 06:07:54 +0300 Subject: [PATCH] Call master_service_init_finish() only after all of the initialization is done. This way if the init crashes, the master process will throttle a buggy service. --- src/anvil/main.c | 2 +- src/auth/main.c | 2 +- src/dict/main.c | 2 +- src/director/director-test.c | 2 +- src/director/main.c | 2 +- src/doveadm/main.c | 2 +- src/imap-urlauth/imap-urlauth-worker.c | 3 +-- src/imap/main.c | 2 +- src/indexer/indexer-worker.c | 2 +- src/indexer/indexer.c | 2 +- src/ipc/main.c | 2 +- src/lib-master/master-service.c | 2 +- src/lib-master/master-service.h | 5 ++++- src/lmtp/main.c | 2 +- src/log/main.c | 3 +-- src/plugins/quota/quota-status.c | 2 +- src/pop3/main.c | 2 +- src/replication/replicator/replicator.c | 2 +- src/ssl-params/main.c | 3 +-- src/stats/main.c | 2 +- src/util/script.c | 5 ++--- 21 files changed, 25 insertions(+), 26 deletions(-) diff --git a/src/anvil/main.c b/src/anvil/main.c index 0730bee432..6341e65d24 100644 --- a/src/anvil/main.c +++ b/src/anvil/main.c @@ -73,11 +73,11 @@ int main(int argc, char *argv[]) /* delay dying until all of our clients are gone */ master_service_set_die_with_master(master_service, FALSE); - master_service_init_finish(master_service); connect_limit = connect_limit_init(); penalty = penalty_init(); log_fdpass_io = io_add(MASTER_ANVIL_LOG_FDPASS_FD, IO_READ, log_fdpass_input, (void *)NULL); + master_service_init_finish(master_service); master_service_run(master_service, client_connected); diff --git a/src/auth/main.c b/src/auth/main.c index 16e7dec29c..213027d1a7 100644 --- a/src/auth/main.c +++ b/src/auth/main.c @@ -387,9 +387,9 @@ int main(int argc, char *argv[]) } main_preinit(); - master_service_init_finish(master_service); master_service_set_die_callback(master_service, auth_die); main_init(); + master_service_init_finish(master_service); master_service_run(master_service, worker ? worker_connected : client_connected); main_deinit(); diff --git a/src/dict/main.c b/src/dict/main.c index 8ea73a23fd..460bdbb8cc 100644 --- a/src/dict/main.c +++ b/src/dict/main.c @@ -98,10 +98,10 @@ int main(int argc, char *argv[]) master_service_init_log(master_service, "dict: "); main_preinit(); - master_service_init_finish(master_service); master_service_set_die_callback(master_service, dict_die); main_init(); + master_service_init_finish(master_service); master_service_run(master_service, client_connected); main_deinit(); diff --git a/src/director/director-test.c b/src/director/director-test.c index 11821d1125..62d2a9e6f5 100644 --- a/src/director/director-test.c +++ b/src/director/director-test.c @@ -594,9 +594,9 @@ int main(int argc, char *argv[]) i_fatal("director-doveadm socket path missing"); master_service_init_log(master_service, "director-test: "); - master_service_init_finish(master_service); main_init(admin_path); + master_service_init_finish(master_service); master_service_run(master_service, client_connected); main_deinit(); diff --git a/src/director/main.c b/src/director/main.c index fdd4bc3d70..637d91fedf 100644 --- a/src/director/main.c +++ b/src/director/main.c @@ -213,7 +213,6 @@ int main(int argc, char *argv[]) master_service_init_log(master_service, "director: "); main_preinit(); - master_service_init_finish(master_service); director->test_port = test_port; director_debug = debug; director_connect(director); @@ -225,6 +224,7 @@ int main(int argc, char *argv[]) t_strdup_printf("director(%s): ", net_ip2addr(&director->self_ip))); } + master_service_init_finish(master_service); master_service_run(master_service, client_connected); main_deinit(); diff --git a/src/doveadm/main.c b/src/doveadm/main.c index 3e9c48e632..0b2e56c9e8 100644 --- a/src/doveadm/main.c +++ b/src/doveadm/main.c @@ -85,10 +85,10 @@ int main(int argc, char *argv[]) master_service_init_log(master_service, "doveadm: "); main_preinit(); - master_service_init_finish(master_service); master_service_set_die_callback(master_service, doveadm_die); main_init(); + master_service_init_finish(master_service); master_service_run(master_service, client_connected); main_deinit(); diff --git a/src/imap-urlauth/imap-urlauth-worker.c b/src/imap-urlauth/imap-urlauth-worker.c index 49a3d59610..d8209ac95f 100644 --- a/src/imap-urlauth/imap-urlauth-worker.c +++ b/src/imap-urlauth/imap-urlauth-worker.c @@ -1005,14 +1005,13 @@ int main(int argc, char *argv[]) master_service_init_log(master_service, t_strdup_printf("imap-urlauth[%s]: ", my_pid)); - - master_service_init_finish(master_service); master_service_set_die_callback(master_service, imap_urlauth_worker_die); random_init(); storage_service = mail_storage_service_init(master_service, set_roots, storage_service_flags); + master_service_init_finish(master_service); /* fake that we're running, so we know if client was destroyed while handling its initial input */ diff --git a/src/imap/main.c b/src/imap/main.c index 4ba1eb4b37..a4cb6aeb93 100644 --- a/src/imap/main.c +++ b/src/imap/main.c @@ -363,7 +363,6 @@ int main(int argc, char *argv[]) } } - master_service_init_finish(master_service); master_service_set_die_callback(master_service, imap_die); /* plugins may want to add commands, so this needs to be called early */ @@ -374,6 +373,7 @@ int main(int argc, char *argv[]) storage_service = mail_storage_service_init(master_service, set_roots, storage_service_flags); + master_service_init_finish(master_service); /* fake that we're running, so we know if client was destroyed while handling its initial input */ diff --git a/src/indexer/indexer-worker.c b/src/indexer/indexer-worker.c index 7d3ca3e346..34c9da217b 100644 --- a/src/indexer/indexer-worker.c +++ b/src/indexer/indexer-worker.c @@ -69,11 +69,11 @@ int main(int argc, char *argv[]) drop_privileges(); master_service_init_log(master_service, "indexer-worker: "); - master_service_init_finish(master_service); storage_service = mail_storage_service_init(master_service, NULL, storage_service_flags); restrict_access_allow_coredumps(TRUE); + master_service_init_finish(master_service); master_service_run(master_service, client_connected); diff --git a/src/indexer/indexer.c b/src/indexer/indexer.c index d29ab442e7..9c0dcd8a4c 100644 --- a/src/indexer/indexer.c +++ b/src/indexer/indexer.c @@ -134,11 +134,11 @@ int main(int argc, char *argv[]) restrict_access_allow_coredumps(TRUE); master_service_set_idle_die_callback(master_service, idle_die); - master_service_init_finish(master_service); queue = indexer_queue_init(indexer_client_status_callback); indexer_queue_set_listen_callback(queue, queue_listen_callback); worker_pool = worker_pool_init("indexer-worker", worker_status_callback); + master_service_init_finish(master_service); master_service_run(master_service, client_connected); diff --git a/src/ipc/main.c b/src/ipc/main.c index db2955bf5f..d8311c2f49 100644 --- a/src/ipc/main.c +++ b/src/ipc/main.c @@ -48,8 +48,8 @@ int main(int argc, char *argv[]) restrict_access_by_env(NULL, FALSE); restrict_access_allow_coredumps(TRUE); - master_service_init_finish(master_service); ipc_groups_init(); + master_service_init_finish(master_service); master_service_run(master_service, client_connected); diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index a06b6e8f6e..4ea8b98e17 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -137,6 +137,7 @@ master_service_init(const char *name, enum master_service_flags flags, i_set_failure_prefix("%s(init): ", name); /* ignore these signals as early as possible */ + lib_signals_init(); lib_signals_ignore(SIGPIPE, TRUE); lib_signals_ignore(SIGALRM, FALSE); @@ -428,7 +429,6 @@ void master_service_init_finish(struct master_service *service) struct stat st; /* set default signal handlers */ - lib_signals_init(); if ((service->flags & MASTER_SERVICE_FLAG_STANDALONE) == 0) sigint_flags |= LIBSIG_FLAG_RESTART; lib_signals_set_handler(SIGINT, sigint_flags, sig_die, service); diff --git a/src/lib-master/master-service.h b/src/lib-master/master-service.h index 0ca002b383..c29b994928 100644 --- a/src/lib-master/master-service.h +++ b/src/lib-master/master-service.h @@ -66,7 +66,10 @@ int master_getopt(struct master_service *service); bool master_service_parse_option(struct master_service *service, int opt, const char *arg); /* Finish service initialization. The caller should drop privileges - before calling this. */ + before calling this. This also notifies the master that the service was + successfully started and there shouldn't be any service throttling even if + it crashes afterwards, so this should be called after all of the + initialization code is finished. */ void master_service_init_finish(struct master_service *service); /* Clean environment from everything except the ones listed in diff --git a/src/lmtp/main.c b/src/lmtp/main.c index 0b4a60b4c8..7656ab3fa1 100644 --- a/src/lmtp/main.c +++ b/src/lmtp/main.c @@ -110,7 +110,6 @@ int main(int argc, char *argv[]) if (t_get_current_dir(&base_dir) < 0) i_fatal("getcwd() failed: %m"); drop_privileges(); - master_service_init_finish(master_service); master_service_init_log(master_service, t_strdup_printf("lmtp(%s): ", my_pid)); @@ -119,6 +118,7 @@ int main(int argc, char *argv[]) restrict_access_allow_coredumps(TRUE); main_init(); + master_service_init_finish(master_service); master_service_run(master_service, client_connected); main_deinit(); diff --git a/src/log/main.c b/src/log/main.c index 7cddcef751..a506936bf1 100644 --- a/src/log/main.c +++ b/src/log/main.c @@ -74,12 +74,11 @@ int main(int argc, char *argv[]) restrict_access_by_env(NULL, FALSE); restrict_access_allow_coredumps(TRUE); - master_service_init_finish(master_service); - /* logging should never die if there are some clients */ master_service_set_die_with_master(master_service, FALSE); main_init(); + master_service_init_finish(master_service); master_service_run(master_service, client_connected); main_deinit(); master_service_deinit(&master_service); diff --git a/src/plugins/quota/quota-status.c b/src/plugins/quota/quota-status.c index bff754049d..3b1ebc7d7a 100644 --- a/src/plugins/quota/quota-status.c +++ b/src/plugins/quota/quota-status.c @@ -237,9 +237,9 @@ int main(int argc, char *argv[]) master_service_init_log(master_service, "doveadm: "); main_preinit(); - master_service_init_finish(master_service); main_init(); + master_service_init_finish(master_service); master_service_run(master_service, client_connected); main_deinit(); master_service_deinit(&master_service); diff --git a/src/pop3/main.c b/src/pop3/main.c index 9febd2c95c..a5e03308a7 100644 --- a/src/pop3/main.c +++ b/src/pop3/main.c @@ -253,12 +253,12 @@ int main(int argc, char *argv[]) login_set.callback = login_client_connected; login_set.failure_callback = login_client_failed; - master_service_init_finish(master_service); master_service_set_die_callback(master_service, pop3_die); storage_service = mail_storage_service_init(master_service, set_roots, storage_service_flags); + master_service_init_finish(master_service); /* fake that we're running, so we know if client was destroyed while handling its initial input */ diff --git a/src/replication/replicator/replicator.c b/src/replication/replicator/replicator.c index a1d90e24f1..f35b0e2b41 100644 --- a/src/replication/replicator/replicator.c +++ b/src/replication/replicator/replicator.c @@ -125,9 +125,9 @@ int main(int argc, char *argv[]) restrict_access_by_env(NULL, FALSE); restrict_access_allow_coredumps(TRUE); - master_service_init_finish(master_service); main_init(); + master_service_init_finish(master_service); master_service_run(master_service, client_connected); main_deinit(); diff --git a/src/ssl-params/main.c b/src/ssl-params/main.c index 1636d90480..453f3876db 100644 --- a/src/ssl-params/main.c +++ b/src/ssl-params/main.c @@ -147,13 +147,12 @@ int main(int argc, char *argv[]) restrict_access_by_env(NULL, FALSE); restrict_access_allow_coredumps(TRUE); - master_service_init_finish(master_service); - #ifndef HAVE_SSL i_fatal("Dovecot built without SSL support"); #endif main_init(set); + master_service_init_finish(master_service); master_service_run(master_service, client_connected); main_deinit(); diff --git a/src/stats/main.c b/src/stats/main.c index 7d4d35580a..72007b88c0 100644 --- a/src/stats/main.c +++ b/src/stats/main.c @@ -54,7 +54,6 @@ int main(int argc, char *argv[]) restrict_access_by_env(NULL, FALSE); restrict_access_allow_coredumps(TRUE); - master_service_init_finish(master_service); sets = master_service_settings_get_others(master_service); stats_settings = sets[0]; @@ -65,6 +64,7 @@ int main(int argc, char *argv[]) mail_domains_init(); mail_ips_init(); + master_service_init_finish(master_service); master_service_run(master_service, client_connected); clients_destroy_all(); diff --git a/src/util/script.c b/src/util/script.c index ea86043695..eac3e883ed 100644 --- a/src/util/script.c +++ b/src/util/script.c @@ -211,15 +211,14 @@ int main(int argc, char *argv[]) argv += optind; master_service_init_log(master_service, "script: "); + if (argv[0] == NULL) + i_fatal("Missing script path"); restrict_access_by_env(NULL, FALSE); restrict_access_allow_coredumps(TRUE); master_service_init_finish(master_service); master_service_set_service_count(master_service, 1); - if (argv[0] == NULL) - i_fatal("Missing script path"); - if (argv[0][0] == '/') binary = argv[0]; else -- 2.47.3