dovecot-2.0-sslstream: lib-master: Added master_service_stop_new...

dovecot at dovecot.org dovecot at dovecot.org
Sat Feb 13 02:56:04 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0-sslstream/rev/7bdb5816f797
changeset: 10265:7bdb5816f797
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Nov 06 13:56:10 2009 -0500
description:
lib-master: Added master_service_stop_new_connections().

diffstat:

3 files changed, 32 insertions(+), 2 deletions(-)
src/lib-master/master-service-private.h |    1 +
src/lib-master/master-service.c         |   30 ++++++++++++++++++++++++++++--
src/lib-master/master-service.h         |    3 +++

diffs (92 lines):

diff -r 18f5fdeed659 -r 7bdb5816f797 src/lib-master/master-service-private.h
--- a/src/lib-master/master-service-private.h	Thu Nov 05 20:15:40 2009 -0500
+++ b/src/lib-master/master-service-private.h	Fri Nov 06 13:56:10 2009 -0500
@@ -47,6 +47,7 @@ struct master_service {
 	const struct master_service_settings *set;
 	struct setting_parser_context *set_parser;
 
+	unsigned int stopping:1;
 	unsigned int keep_environment:1;
 	unsigned int log_directly:1;
 	unsigned int initial_status_sent:1;
diff -r 18f5fdeed659 -r 7bdb5816f797 src/lib-master/master-service.c
--- a/src/lib-master/master-service.c	Thu Nov 05 20:15:40 2009 -0500
+++ b/src/lib-master/master-service.c	Fri Nov 06 13:56:10 2009 -0500
@@ -264,7 +264,7 @@ bool master_service_parse_option(struct 
 
 static void master_service_error(struct master_service *service)
 {
-	master_service_io_listeners_remove(service);
+	master_service_stop_new_connections(service);
 	if (service->master_status.available_count ==
 	    service->total_available_count || service->die_with_master) {
 		if (service->die_callback == NULL)
@@ -470,6 +470,29 @@ void master_service_stop(struct master_s
         io_loop_stop(service->ioloop);
 }
 
+void master_service_stop_new_connections(struct master_service *service)
+{
+	unsigned int current_count;
+
+	service->stopping = TRUE;
+	master_service_io_listeners_remove(service);
+
+	/* make sure we stop after servicing current connections */
+	current_count = service->total_available_count -
+		service->master_status.available_count;
+	service->service_count_left = current_count;
+	service->total_available_count = current_count;
+
+	if (current_count == 0)
+		master_service_stop(service);
+	else {
+		/* notify master that we're not accepting any more
+		   connections */
+		service->master_status.available_count = 0;
+		master_status_update(service);
+	}
+}
+
 void master_service_anvil_send(struct master_service *service, const char *cmd)
 {
 	ssize_t ret;
@@ -504,6 +527,7 @@ void master_service_client_connection_de
 		i_assert(service->master_status.available_count <
 			 service->total_available_count);
 		service->master_status.available_count++;
+		master_status_update(service);
 	} else {
 		/* we have only limited amount of service requests left */
 		i_assert(service->service_count_left > 0);
@@ -516,7 +540,6 @@ void master_service_client_connection_de
 			master_service_stop(service);
 		}
 	}
-	master_status_update(service);
 
 	if ((service->io_status_error == NULL || service->listeners == NULL) &&
 	    service->master_status.available_count ==
@@ -701,6 +724,9 @@ void master_service_io_listeners_add(str
 void master_service_io_listeners_add(struct master_service *service)
 {
 	unsigned int i;
+
+	if (service->stopping)
+		return;
 
 	if (service->listeners == NULL)
 		io_listeners_init(service);
diff -r 18f5fdeed659 -r 7bdb5816f797 src/lib-master/master-service.h
--- a/src/lib-master/master-service.h	Thu Nov 05 20:15:40 2009 -0500
+++ b/src/lib-master/master-service.h	Fri Nov 06 13:56:10 2009 -0500
@@ -105,6 +105,9 @@ void master_service_run(struct master_se
 			master_service_connection_callback_t *callback);
 /* Stop a running service. */
 void master_service_stop(struct master_service *service);
+/* Stop once we're done serving existing new connections, but don't accept
+   any new ones. */
+void master_service_stop_new_connections(struct master_service *service);
 
 /* Send command to anvil process, if we have fd to it. */
 void master_service_anvil_send(struct master_service *service, const char *cmd);


More information about the dovecot-cvs mailing list