dovecot-2.0-sslstream: imap, pop3: Connection counting fixes.

dovecot at dovecot.org dovecot at dovecot.org
Sat Feb 13 02:55:43 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0-sslstream/rev/40d8df2b4111
changeset: 10195:40d8df2b4111
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Oct 26 20:11:48 2009 -0400
description:
imap, pop3: Connection counting fixes.
Multiple real connections can come from "login connections". For now don't
even try to count login connections.

diffstat:

6 files changed, 39 insertions(+), 11 deletions(-)
src/imap/main.c                         |    3 ++-
src/lib-master/master-login.c           |   18 +++++++++++++++++-
src/lib-master/master-login.h           |    2 +-
src/lib-master/master-service-private.h |    5 +++++
src/lib-master/master-service.c         |   19 ++++++++++++-------
src/pop3/main.c                         |    3 ++-

diffs (194 lines):

diff -r 02e852b2c2c3 -r 40d8df2b4111 src/imap/main.c
--- a/src/imap/main.c	Mon Oct 26 19:53:48 2009 -0400
+++ b/src/imap/main.c	Mon Oct 26 20:11:48 2009 -0400
@@ -269,6 +269,7 @@ int main(int argc, char *argv[])
 		service_flags |= MASTER_SERVICE_FLAG_STANDALONE |
 			MASTER_SERVICE_FLAG_STD_CLIENT;
 	} else {
+		service_flags |= MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN;
 		storage_service_flags |=
 			MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT;
 	}
@@ -297,7 +298,7 @@ int main(int argc, char *argv[])
 			main_stdio_run();
 		} T_END;
 	} else {
-		master_login = master_login_init("auth-master",
+		master_login = master_login_init(master_service, "auth-master",
 						 login_client_connected);
 		io_loop_set_running(current_ioloop);
 	}
diff -r 02e852b2c2c3 -r 40d8df2b4111 src/lib-master/master-login.c
--- a/src/lib-master/master-login.c	Mon Oct 26 19:53:48 2009 -0400
+++ b/src/lib-master/master-login.c	Mon Oct 26 20:11:48 2009 -0400
@@ -6,6 +6,7 @@
 #include "fdpass.h"
 #include "fd-close-on-exec.h"
 #include "llist.h"
+#include "master-service-private.h"
 #include "master-login.h"
 #include "master-login-auth.h"
 
@@ -22,6 +23,7 @@ struct master_login_connection {
 };
 
 struct master_login {
+	struct master_service *service;
 	master_login_callback_t *callback;
 	struct master_login_connection *conns;
 	struct master_login_auth *auth;
@@ -30,14 +32,16 @@ static void master_login_conn_deinit(str
 static void master_login_conn_deinit(struct master_login_connection **_conn);
 
 struct master_login *
-master_login_init(const char *auth_socket_path,
+master_login_init(struct master_service *service, const char *auth_socket_path,
 		  master_login_callback_t *callback)
 {
 	struct master_login *login;
 
 	login = i_new(struct master_login, 1);
+	login->service = service;
 	login->callback = callback;
 	login->auth = master_login_auth_init(auth_socket_path);
+	service->login_connections = TRUE;
 	return login;
 }
 
@@ -127,6 +131,8 @@ master_login_auth_callback(const char *c
 {
 	struct master_login_client *client = context;
 	struct master_auth_reply reply;
+	struct master_service *service = client->conn->login->service;
+	bool close_config;
 
 	memset(&reply, 0, sizeof(reply));
 	reply.tag = client->auth_req.tag;
@@ -142,8 +148,18 @@ master_login_auth_callback(const char *c
 		return;
 	}
 
+	service->master_status.available_count--;
+	master_status_update(service);
+	close_config = service->master_status.available_count == 0 &&
+		service->service_count_left == 1;
+
 	client->conn->login->callback(client, auth_args[0], auth_args+1);
 	i_free(client);
+
+	if (close_config) {
+		/* we're dying as soon as this connection closes. */
+		master_service_close_config_fd(service);
+	}
 }
 
 static void master_login_conn_input(struct master_login_connection *conn)
diff -r 02e852b2c2c3 -r 40d8df2b4111 src/lib-master/master-login.h
--- a/src/lib-master/master-login.h	Mon Oct 26 19:53:48 2009 -0400
+++ b/src/lib-master/master-login.h	Mon Oct 26 20:11:48 2009 -0400
@@ -16,7 +16,7 @@ master_login_callback_t(const struct mas
 			const char *username, const char *const *extra_fields);
 
 struct master_login *
-master_login_init(const char *auth_socket_path,
+master_login_init(struct master_service *service, const char *auth_socket_path,
 		  master_login_callback_t *callback);
 void master_login_deinit(struct master_login **login);
 
diff -r 02e852b2c2c3 -r 40d8df2b4111 src/lib-master/master-service-private.h
--- a/src/lib-master/master-service-private.h	Mon Oct 26 19:53:48 2009 -0400
+++ b/src/lib-master/master-service-private.h	Mon Oct 26 20:11:48 2009 -0400
@@ -53,8 +53,13 @@ struct master_service {
 	unsigned int die_with_master:1;
 	unsigned int call_avail_overflow:1;
 	unsigned int delay_status_updates:1;
+	/* incoming connections are going to master-login and they're not
+	   counted as real connections */
+	unsigned int login_connections:1;
 };
 
 void master_service_io_listeners_add(struct master_service *service);
+void master_status_update(struct master_service *service);
+void master_service_close_config_fd(struct master_service *service);
 
 #endif
diff -r 02e852b2c2c3 -r 40d8df2b4111 src/lib-master/master-service.c
--- a/src/lib-master/master-service.c	Mon Oct 26 19:53:48 2009 -0400
+++ b/src/lib-master/master-service.c	Mon Oct 26 20:11:48 2009 -0400
@@ -40,7 +40,6 @@ struct master_service *master_service;
 
 static void master_service_refresh_login_state(struct master_service *service);
 static void io_listeners_remove(struct master_service *service);
-static void master_status_update(struct master_service *service);
 
 const char *master_service_getopt_string(void)
 {
@@ -571,7 +570,7 @@ static void master_service_refresh_login
 		master_service_set_login_state(service, ret);
 }
 
-static void master_service_close_config_fd(struct master_service *service)
+void master_service_close_config_fd(struct master_service *service)
 {
 	if (service->config_fd != -1) {
 		if (close(service->config_fd) < 0)
@@ -619,6 +618,7 @@ static void master_service_listen(struct
 {
 	struct master_service *service = l->service;
 	struct master_service_connection conn;
+	bool close_config;
 
 	if (service->master_status.available_count == 0) {
 		/* we are full. stop listening for now, unless overflow
@@ -660,13 +660,18 @@ static void master_service_listen(struct
 	conn.ssl = l->ssl;
 	net_set_nonblock(conn.fd, TRUE);
 
-	service->master_status.available_count--;
-        master_status_update(service);
+	if (service->login_connections)
+		close_config = FALSE;
+	else {
+		service->master_status.available_count--;
+		master_status_update(service);
+		close_config = service->master_status.available_count == 0 &&
+			service->service_count_left == 1;
+	}
 
 	service->callback(&conn);
 
-	if (service->master_status.available_count == 0 &&
-	    service->service_count_left == 1) {
+	if (close_config) {
 		/* we're dying as soon as this connection closes. */
 		master_service_close_config_fd(service);
 	}
@@ -731,7 +736,7 @@ static bool master_status_update_is_impo
 	return FALSE;
 }
 
-static void master_status_update(struct master_service *service)
+void master_status_update(struct master_service *service)
 {
 	ssize_t ret;
 
diff -r 02e852b2c2c3 -r 40d8df2b4111 src/pop3/main.c
--- a/src/pop3/main.c	Mon Oct 26 19:53:48 2009 -0400
+++ b/src/pop3/main.c	Mon Oct 26 20:11:48 2009 -0400
@@ -195,6 +195,7 @@ int main(int argc, char *argv[])
 		service_flags |= MASTER_SERVICE_FLAG_STANDALONE |
 			MASTER_SERVICE_FLAG_STD_CLIENT;
 	} else {
+		service_flags |= MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN;
 		storage_service_flags |=
 			MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT;
 	}
@@ -219,7 +220,7 @@ int main(int argc, char *argv[])
 			main_stdio_run();
 		} T_END;
 	} else {
-		master_login = master_login_init("auth-master",
+		master_login = master_login_init(master_service, "auth-master",
 						 login_client_connected);
 		io_loop_set_running(current_ioloop);
 	}


More information about the dovecot-cvs mailing list