dovecot-2.2: Call master_service_init_finish() only after all of...

dovecot at dovecot.org dovecot at dovecot.org
Thu Jun 13 06:09:25 EEST 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/754d244b8249
changeset: 16508:754d244b8249
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Jun 13 06:07:54 2013 +0300
description:
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.

diffstat:

 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(-)

diffs (truncated from 349 to 300 lines):

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);
-


More information about the dovecot-cvs mailing list