dovecot-2.1: lib-auth: Improved warning message about aborting a...

dovecot at dovecot.org dovecot at dovecot.org
Fri Jan 20 16:37:20 EET 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/3dae51fd4565
changeset: 13959:3dae51fd4565
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Jan 20 16:37:10 2012 +0200
description:
lib-auth: Improved warning message about aborting auth requests.

diffstat:

 src/lib-auth/auth-client-request.c    |   7 ++++
 src/lib-auth/auth-client-request.h    |   1 +
 src/lib-auth/auth-client.c            |   4 +-
 src/lib-auth/auth-client.h            |   2 +-
 src/lib-auth/auth-server-connection.c |  58 ++++++++++++++++++++++++----------
 src/lib-auth/auth-server-connection.h |   3 +-
 src/login-common/client-common.c      |   2 +-
 src/login-common/main.c               |   2 +-
 8 files changed, 55 insertions(+), 24 deletions(-)

diffs (278 lines):

diff -r 7175320feafc -r 3dae51fd4565 src/lib-auth/auth-client-request.c
--- a/src/lib-auth/auth-client-request.c	Thu Jan 19 17:46:52 2012 +0200
+++ b/src/lib-auth/auth-client-request.c	Fri Jan 20 16:37:10 2012 +0200
@@ -15,6 +15,7 @@
 
 	struct auth_server_connection *conn;
 	unsigned int id;
+	time_t created;
 
 	struct auth_request_info request_info;
 
@@ -91,6 +92,7 @@
 
 	request->id =
 		auth_server_connection_add_request(request->conn, request);
+	request->created = ioloop_time;
 	T_BEGIN {
 		auth_server_send_new_request(request->conn, request);
 	} T_END;
@@ -159,6 +161,11 @@
 	return request->callback == NULL;
 }
 
+time_t auth_client_request_get_create_time(struct auth_client_request *request)
+{
+	return request->created;
+}
+
 void auth_client_request_server_input(struct auth_client_request *request,
 				      enum auth_request_status status,
 				      const char *const *args)
diff -r 7175320feafc -r 3dae51fd4565 src/lib-auth/auth-client-request.h
--- a/src/lib-auth/auth-client-request.h	Thu Jan 19 17:46:52 2012 +0200
+++ b/src/lib-auth/auth-client-request.h	Fri Jan 20 16:37:10 2012 +0200
@@ -4,6 +4,7 @@
 struct auth_server_connection;
 
 bool auth_client_request_is_aborted(struct auth_client_request *request);
+time_t auth_client_request_get_create_time(struct auth_client_request *request);
 
 void auth_client_request_server_input(struct auth_client_request *request,
 				      enum auth_request_status status,
diff -r 7175320feafc -r 3dae51fd4565 src/lib-auth/auth-client.c
--- a/src/lib-auth/auth-client.c	Thu Jan 19 17:46:52 2012 +0200
+++ b/src/lib-auth/auth-client.c	Fri Jan 20 16:37:10 2012 +0200
@@ -37,9 +37,9 @@
 		auth_server_connection_connect(client->conn);
 }
 
-void auth_client_disconnect(struct auth_client *client)
+void auth_client_disconnect(struct auth_client *client, const char *reason)
 {
-	auth_server_connection_disconnect(client->conn);
+	auth_server_connection_disconnect(client->conn, reason);
 }
 
 bool auth_client_is_connected(struct auth_client *client)
diff -r 7175320feafc -r 3dae51fd4565 src/lib-auth/auth-client.h
--- a/src/lib-auth/auth-client.h	Thu Jan 19 17:46:52 2012 +0200
+++ b/src/lib-auth/auth-client.h	Fri Jan 20 16:37:10 2012 +0200
@@ -61,7 +61,7 @@
 void auth_client_deinit(struct auth_client **client);
 
 void auth_client_connect(struct auth_client *client);
-void auth_client_disconnect(struct auth_client *client);
+void auth_client_disconnect(struct auth_client *client, const char *reason);
 bool auth_client_is_connected(struct auth_client *client);
 bool auth_client_is_disconnected(struct auth_client *client);
 void auth_client_set_connect_notify(struct auth_client *client,
diff -r 7175320feafc -r 3dae51fd4565 src/lib-auth/auth-server-connection.c
--- a/src/lib-auth/auth-server-connection.c	Thu Jan 19 17:46:52 2012 +0200
+++ b/src/lib-auth/auth-server-connection.c	Fri Jan 20 16:37:10 2012 +0200
@@ -3,6 +3,7 @@
 #include "lib.h"
 #include "array.h"
 #include "hash.h"
+#include "hostpid.h"
 #include "ioloop.h"
 #include "istream.h"
 #include "ostream.h"
@@ -20,7 +21,8 @@
 #define AUTH_SERVER_RECONNECT_TIMEOUT_SECS 5
 
 static void
-auth_server_connection_reconnect(struct auth_server_connection *conn);
+auth_server_connection_reconnect(struct auth_server_connection *conn,
+				 const char *disconnect_reason);
 
 static int
 auth_server_input_mech(struct auth_server_connection *conn,
@@ -235,7 +237,7 @@
 static void auth_server_connection_input(struct auth_server_connection *conn)
 {
 	struct istream *input;
-	const char *line;
+	const char *line, *error;
 	int ret;
 
 	switch (i_stream_read(conn->input)) {
@@ -243,13 +245,15 @@
 		return;
 	case -1:
 		/* disconnected */
-		auth_server_connection_reconnect(conn);
+		error = conn->input->stream_errno != 0 ?
+			strerror(conn->input->stream_errno) : "EOF";
+		auth_server_connection_reconnect(conn, error);
 		return;
 	case -2:
 		/* buffer full - can't happen unless auth is buggy */
 		i_error("BUG: Auth server sent us more than %d bytes of data",
 			AUTH_SERVER_CONN_MAX_LINE_LENGTH);
-		auth_server_connection_disconnect(conn);
+		auth_server_connection_disconnect(conn, "buffer full");
 		return;
 	}
 
@@ -264,7 +268,8 @@
 				     AUTH_CLIENT_PROTOCOL_MAJOR_VERSION)) {
 			i_error("Authentication server not compatible with "
 				"this client (mixed old and new binaries?)");
-			auth_server_connection_disconnect(conn);
+			auth_server_connection_disconnect(conn,
+				"incompatible serevr");
 			return;
 		}
 		conn->version_received = TRUE;
@@ -278,7 +283,8 @@
 		} T_END;
 
 		if (ret < 0) {
-			auth_server_connection_disconnect(conn);
+			auth_server_connection_disconnect(conn, t_strdup_printf(
+				"Received broken input: %s", line));
 			break;
 		}
 	}
@@ -303,31 +309,45 @@
 }
 
 static void
-auth_server_connection_remove_requests(struct auth_server_connection *conn)
+auth_server_connection_remove_requests(struct auth_server_connection *conn,
+				       const char *disconnect_reason)
 {
 	static const char *const temp_failure_args[] = { "temp", NULL };
 	struct hash_iterate_context *iter;
 	void *key, *value;
-	unsigned int request_count = hash_table_count(conn->requests);
+	time_t created, oldest = 0;
+	unsigned int request_count = 0;
 
-	if (request_count == 0)
+	if (hash_table_count(conn->requests) == 0)
 		return;
 
-	i_warning("Auth connection closed with %u pending requests",
-		  request_count);
 	iter = hash_table_iterate_init(conn->requests);
 	while (hash_table_iterate(iter, &key, &value)) {
 		struct auth_client_request *request = value;
 
+		if (!auth_client_request_is_aborted(request)) {
+			request_count++;
+			created = auth_client_request_get_create_time(request);
+			if (oldest > created || oldest == 0)
+				oldest = created;
+		}
+
 		auth_client_request_server_input(request,
 			AUTH_REQUEST_STATUS_INTERNAL_FAIL,
 			temp_failure_args);
 	}
+
+	i_warning("Auth connection closed with %u pending requests "
+		  "(max %u secs, pid=%s, %s)", request_count,
+		  (unsigned int)(ioloop_time - oldest),
+		  my_pid, disconnect_reason);
+
 	hash_table_iterate_deinit(&iter);
 	hash_table_clear(conn->requests, FALSE);
 }
 
-void auth_server_connection_disconnect(struct auth_server_connection *conn)
+void auth_server_connection_disconnect(struct auth_server_connection *conn,
+				       const char *reason)
 {
 	conn->handshake_received = FALSE;
 	conn->version_received = FALSE;
@@ -350,7 +370,7 @@
 		conn->fd = -1;
 	}
 
-	auth_server_connection_remove_requests(conn);
+	auth_server_connection_remove_requests(conn, reason);
 
 	if (conn->client->connect_notify_callback != NULL) {
 		conn->client->connect_notify_callback(conn->client, FALSE,
@@ -364,11 +384,12 @@
 }
 
 static void
-auth_server_connection_reconnect(struct auth_server_connection *conn)
+auth_server_connection_reconnect(struct auth_server_connection *conn,
+				 const char *disconnect_reason)
 {
 	time_t next_connect;
 
-	auth_server_connection_disconnect(conn);
+	auth_server_connection_disconnect(conn, disconnect_reason);
 
 	next_connect = conn->last_connect + AUTH_SERVER_RECONNECT_TIMEOUT_SECS;
 	conn->to = timeout_add(ioloop_time >= next_connect ? 0 :
@@ -382,7 +403,7 @@
 
 	*_conn = NULL;
 
-	auth_server_connection_disconnect(conn);
+	auth_server_connection_disconnect(conn, "deinitializing");
 	i_assert(hash_table_count(conn->requests) == 0);
 	hash_table_destroy(&conn->requests);
 	array_free(&conn->available_auth_mechs);
@@ -394,7 +415,7 @@
 	i_error("Timeout waiting for handshake from auth server. "
 		"my pid=%u, input bytes=%"PRIuUOFF_T,
 		conn->client->client_pid, conn->input->v_offset);
-	auth_server_connection_reconnect(conn);
+	auth_server_connection_reconnect(conn, "auth server timeout");
 }
 
 int auth_server_connection_connect(struct auth_server_connection *conn)
@@ -434,7 +455,8 @@
 				    conn->client->client_pid);
 	if (o_stream_send_str(conn->output, handshake) < 0) {
 		i_warning("Error sending handshake to auth server: %m");
-		auth_server_connection_disconnect(conn);
+		auth_server_connection_disconnect(conn,
+			strerror(conn->output->last_failed_errno));
 		return -1;
 	}
 
diff -r 7175320feafc -r 3dae51fd4565 src/lib-auth/auth-server-connection.h
--- a/src/lib-auth/auth-server-connection.h	Thu Jan 19 17:46:52 2012 +0200
+++ b/src/lib-auth/auth-server-connection.h	Fri Jan 20 16:37:10 2012 +0200
@@ -31,7 +31,8 @@
 void auth_server_connection_deinit(struct auth_server_connection **conn);
 
 int auth_server_connection_connect(struct auth_server_connection *conn);
-void auth_server_connection_disconnect(struct auth_server_connection *conn);
+void auth_server_connection_disconnect(struct auth_server_connection *conn,
+				       const char *reason);
 
 unsigned int
 auth_server_connection_add_request(struct auth_server_connection *conn,
diff -r 7175320feafc -r 3dae51fd4565 src/login-common/client-common.c
--- a/src/login-common/client-common.c	Thu Jan 19 17:46:52 2012 +0200
+++ b/src/login-common/client-common.c	Fri Jan 20 16:37:10 2012 +0200
@@ -162,7 +162,7 @@
 		   authentication anymore, so close the connection.
 		   do this only with initial service_count=1, in case there
 		   are other clients with pending authentications */
-		auth_client_disconnect(auth_client);
+		auth_client_disconnect(auth_client, "unnecessary connection");
 	}
 	login_client_destroyed();
 	login_refresh_proctitle();
diff -r 7175320feafc -r 3dae51fd4565 src/login-common/main.c
--- a/src/login-common/main.c	Thu Jan 19 17:46:52 2012 +0200
+++ b/src/login-common/main.c	Fri Jan 20 16:37:10 2012 +0200
@@ -73,7 +73,7 @@
 {
 	i_assert(clients == NULL);
 
-	auth_client_disconnect(auth_client);
+	auth_client_disconnect(auth_client, "idle disconnect");
 	timeout_remove(&auth_client_to);
 }
 


More information about the dovecot-cvs mailing list