]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Call master_service_init_finish() only after all of the initialization is done.
authorTimo Sirainen <tss@iki.fi>
Thu, 13 Jun 2013 03:07:54 +0000 (06:07 +0300)
committerTimo Sirainen <tss@iki.fi>
Thu, 13 Jun 2013 03:07:54 +0000 (06:07 +0300)
This way if the init crashes, the master process will throttle a buggy
service.

21 files changed:
src/anvil/main.c
src/auth/main.c
src/dict/main.c
src/director/director-test.c
src/director/main.c
src/doveadm/main.c
src/imap-urlauth/imap-urlauth-worker.c
src/imap/main.c
src/indexer/indexer-worker.c
src/indexer/indexer.c
src/ipc/main.c
src/lib-master/master-service.c
src/lib-master/master-service.h
src/lmtp/main.c
src/log/main.c
src/plugins/quota/quota-status.c
src/pop3/main.c
src/replication/replicator/replicator.c
src/ssl-params/main.c
src/stats/main.c
src/util/script.c

index 0730bee4329b3553ef3eb550bc296c86a497ea57..6341e65d24bc3f72bc1de76c1046a7c612aa515f 100644 (file)
@@ -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);
 
index 16e7dec29c8b123ddb4343d83d60edd925b9ad1f..213027d1a7ea1edee38f7a7b41e0aa1bb6012a61 100644 (file)
@@ -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();
index 8ea73a23fd737ab78812e71df78f1418d50da842..460bdbb8ccd3dcd2cd9d1a0a085ab0256f94a8ab 100644 (file)
@@ -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();
index 11821d1125bf918cb417f88f421ef19a9654a2d4..62d2a9e6f510873cac4dfe839d4e1f7cde92043a 100644 (file)
@@ -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();
 
index fdd4bc3d70a4acea90e5ca2bde60bc7eb9113bc9..637d91fedf8f6a1777a93650f17036377f6b6647 100644 (file)
@@ -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();
index 3e9c48e632bac3e990119af855fe799288afc6d5..0b2e56c9e88be103a208e3e1c7585ead07d35222 100644 (file)
@@ -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();
index 49a3d596102237e044397bf492f1b5e81c8f717c..d8209ac95f94b03177f887c662b1efa7216892cc 100644 (file)
@@ -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 */
index 4ba1eb4b37348f08ba1e2259266d73d14a5c7d57..a4cb6aeb9304b4114bd13f454cf97e79dace41bc 100644 (file)
@@ -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 */
index 7d3ca3e346ef00c91a16ba4c49bd3b067d3106c0..34c9da217b5dcdac7cb43251601dc5d917056b8c 100644 (file)
@@ -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);
 
index d29ab442e799bb92947ad5fad5ad9fedc0b4e813..9c0dcd8a4c0f151fcab087e3c4f48187ccddf1dc 100644 (file)
@@ -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);
 
index db2955bf5f12497ce9c7d047b8d849d4bd1e10a9..d8311c2f497307f64e00006e444068979c26c7af 100644 (file)
@@ -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);
 
index a06b6e8f6e898fc8a79dd0a8615d52c95eee046a..4ea8b98e17435529b60e38501ba4b5435bdca699 100644 (file)
@@ -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);
index 0ca002b3834981dbd94be0fbef322e276e4d96f5..c29b994928d59327dc3e17be4b5e26cf9dde2383 100644 (file)
@@ -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
index 0b4a60b4c8dc6f183b9d05880a9974a0dd45208f..7656ab3fa1f25c842772d5f17174bc661f7089af 100644 (file)
@@ -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();
index 7cddcef7510c349dcb26f6ec09d99885f495a678..a506936bf1dfd9be0fe56024b73ac3ee3cf1dc49 100644 (file)
@@ -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);
index bff754049d2c6562b18c3e0907f371d39c671954..3b1ebc7d7a21b49ce48fd775688c82a24f13bd42 100644 (file)
@@ -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);
index 9febd2c95c68ea77de0fb8e7ecddf74b785e5e39..a5e03308a711a4b3271ea9109e3af5a556fac3ea 100644 (file)
@@ -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 */
index a1d90e24f1238e3e0657cae2a4d0d48d5217bbdf..f35b0e2b41a9e8d8d9af7cd5509e645a889ada77 100644 (file)
@@ -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();
 
index 1636d90480912afe7d05fba0f0ea28719ec09da6..453f3876dbff83fdadfed7fd77b3a43cc69cf017 100644 (file)
@@ -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();
 
index 7d4d35580a292d0df85fc21d99768ae6290846c1..72007b88c0861d474929346a6260da3032281b8d 100644 (file)
@@ -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();
index ea86043695610f9940b34c8e68e7f982f81e2e2b..eac3e883edb0872c0d030f600d7f6bdab127ec45 100644 (file)
@@ -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