# HG changeset patch # User Timo Sirainen # Date 1371092874 -10800 # Node ID 754d244b8249cfa7931bd22b7c59a040efa6a232 # Parent c012f8df87f91089afd5837472f00670a47f2b9b 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. diff -r c012f8df87f9 -r 754d244b8249 src/anvil/main.c --- a/src/anvil/main.c Thu Jun 13 05:29:07 2013 +0300 +++ b/src/anvil/main.c Thu Jun 13 06:07:54 2013 +0300 @@ -73,11 +73,11 @@ /* 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 -r c012f8df87f9 -r 754d244b8249 src/auth/main.c --- a/src/auth/main.c Thu Jun 13 05:29:07 2013 +0300 +++ b/src/auth/main.c Thu Jun 13 06:07:54 2013 +0300 @@ -387,9 +387,9 @@ } 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 -r c012f8df87f9 -r 754d244b8249 src/dict/main.c --- a/src/dict/main.c Thu Jun 13 05:29:07 2013 +0300 +++ b/src/dict/main.c Thu Jun 13 06:07:54 2013 +0300 @@ -98,10 +98,10 @@ 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 -r c012f8df87f9 -r 754d244b8249 src/director/director-test.c --- a/src/director/director-test.c Thu Jun 13 05:29:07 2013 +0300 +++ b/src/director/director-test.c Thu Jun 13 06:07:54 2013 +0300 @@ -594,9 +594,9 @@ 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 -r c012f8df87f9 -r 754d244b8249 src/director/main.c --- a/src/director/main.c Thu Jun 13 05:29:07 2013 +0300 +++ b/src/director/main.c Thu Jun 13 06:07:54 2013 +0300 @@ -213,7 +213,6 @@ 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 @@ 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 -r c012f8df87f9 -r 754d244b8249 src/doveadm/main.c --- a/src/doveadm/main.c Thu Jun 13 05:29:07 2013 +0300 +++ b/src/doveadm/main.c Thu Jun 13 06:07:54 2013 +0300 @@ -85,10 +85,10 @@ 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 -r c012f8df87f9 -r 754d244b8249 src/imap-urlauth/imap-urlauth-worker.c --- a/src/imap-urlauth/imap-urlauth-worker.c Thu Jun 13 05:29:07 2013 +0300 +++ b/src/imap-urlauth/imap-urlauth-worker.c Thu Jun 13 06:07:54 2013 +0300 @@ -1005,14 +1005,13 @@ 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 -r c012f8df87f9 -r 754d244b8249 src/imap/main.c --- a/src/imap/main.c Thu Jun 13 05:29:07 2013 +0300 +++ b/src/imap/main.c Thu Jun 13 06:07:54 2013 +0300 @@ -363,7 +363,6 @@ } } - 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 @@ 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 -r c012f8df87f9 -r 754d244b8249 src/indexer/indexer-worker.c --- a/src/indexer/indexer-worker.c Thu Jun 13 05:29:07 2013 +0300 +++ b/src/indexer/indexer-worker.c Thu Jun 13 06:07:54 2013 +0300 @@ -69,11 +69,11 @@ 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 -r c012f8df87f9 -r 754d244b8249 src/indexer/indexer.c --- a/src/indexer/indexer.c Thu Jun 13 05:29:07 2013 +0300 +++ b/src/indexer/indexer.c Thu Jun 13 06:07:54 2013 +0300 @@ -134,11 +134,11 @@ 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 -r c012f8df87f9 -r 754d244b8249 src/ipc/main.c --- a/src/ipc/main.c Thu Jun 13 05:29:07 2013 +0300 +++ b/src/ipc/main.c Thu Jun 13 06:07:54 2013 +0300 @@ -48,8 +48,8 @@ restrict_access_by_env(NULL, FALSE); restrict_access_allow_coredumps(TRUE); + ipc_groups_init(); master_service_init_finish(master_service); - ipc_groups_init(); master_service_run(master_service, client_connected); diff -r c012f8df87f9 -r 754d244b8249 src/lib-master/master-service.c --- a/src/lib-master/master-service.c Thu Jun 13 05:29:07 2013 +0300 +++ b/src/lib-master/master-service.c Thu Jun 13 06:07:54 2013 +0300 @@ -137,6 +137,7 @@ 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 @@ 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 -r c012f8df87f9 -r 754d244b8249 src/lib-master/master-service.h --- a/src/lib-master/master-service.h Thu Jun 13 05:29:07 2013 +0300 +++ b/src/lib-master/master-service.h Thu Jun 13 06:07:54 2013 +0300 @@ -66,7 +66,10 @@ 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 -r c012f8df87f9 -r 754d244b8249 src/lmtp/main.c --- a/src/lmtp/main.c Thu Jun 13 05:29:07 2013 +0300 +++ b/src/lmtp/main.c Thu Jun 13 06:07:54 2013 +0300 @@ -110,7 +110,6 @@ 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 @@ restrict_access_allow_coredumps(TRUE); main_init(); + master_service_init_finish(master_service); master_service_run(master_service, client_connected); main_deinit(); diff -r c012f8df87f9 -r 754d244b8249 src/log/main.c --- a/src/log/main.c Thu Jun 13 05:29:07 2013 +0300 +++ b/src/log/main.c Thu Jun 13 06:07:54 2013 +0300 @@ -74,12 +74,11 @@ 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 -r c012f8df87f9 -r 754d244b8249 src/plugins/quota/quota-status.c --- a/src/plugins/quota/quota-status.c Thu Jun 13 05:29:07 2013 +0300 +++ b/src/plugins/quota/quota-status.c Thu Jun 13 06:07:54 2013 +0300 @@ -237,9 +237,9 @@ 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 -r c012f8df87f9 -r 754d244b8249 src/pop3/main.c --- a/src/pop3/main.c Thu Jun 13 05:29:07 2013 +0300 +++ b/src/pop3/main.c Thu Jun 13 06:07:54 2013 +0300 @@ -253,12 +253,12 @@ 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 -r c012f8df87f9 -r 754d244b8249 src/replication/replicator/replicator.c --- a/src/replication/replicator/replicator.c Thu Jun 13 05:29:07 2013 +0300 +++ b/src/replication/replicator/replicator.c Thu Jun 13 06:07:54 2013 +0300 @@ -125,9 +125,9 @@ 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 -r c012f8df87f9 -r 754d244b8249 src/ssl-params/main.c --- a/src/ssl-params/main.c Thu Jun 13 05:29:07 2013 +0300 +++ b/src/ssl-params/main.c Thu Jun 13 06:07:54 2013 +0300 @@ -147,13 +147,12 @@ 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 -r c012f8df87f9 -r 754d244b8249 src/stats/main.c --- a/src/stats/main.c Thu Jun 13 05:29:07 2013 +0300 +++ b/src/stats/main.c Thu Jun 13 06:07:54 2013 +0300 @@ -54,7 +54,6 @@ 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 @@ mail_domains_init(); mail_ips_init(); + master_service_init_finish(master_service); master_service_run(master_service, client_connected); clients_destroy_all(); diff -r c012f8df87f9 -r 754d244b8249 src/util/script.c --- a/src/util/script.c Thu Jun 13 05:29:07 2013 +0300 +++ b/src/util/script.c Thu Jun 13 06:07:54 2013 +0300 @@ -211,15 +211,14 @@ 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