dovecot-2.2: auth: Use proxy_timeout as DNS lookup timeout, if a...

dovecot at dovecot.org dovecot at dovecot.org
Sat Feb 25 05:13:46 EET 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/8e2f395cf86c
changeset: 14156:8e2f395cf86c
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Feb 25 05:11:59 2012 +0200
description:
auth: Use proxy_timeout as DNS lookup timeout, if available. Warn if lookup takes >0.5s.

diffstat:

 src/auth/auth-request.c |  31 ++++++++++++++++++++++++-------
 1 files changed, 24 insertions(+), 7 deletions(-)

diffs (67 lines):

diff -r da43dc494753 -r 8e2f395cf86c src/auth/auth-request.c
--- a/src/auth/auth-request.c	Sat Feb 25 05:04:15 2012 +0200
+++ b/src/auth/auth-request.c	Sat Feb 25 05:11:59 2012 +0200
@@ -29,7 +29,8 @@
 #include <sys/stat.h>
 
 #define AUTH_DNS_SOCKET_PATH "dns-client"
-#define AUTH_DNS_TIMEOUT_MSECS (1000*10)
+#define AUTH_DNS_DEFAULT_TIMEOUT_MSECS (1000*10)
+#define AUTH_DNS_WARN_MSECS 500
 #define CACHED_PASSWORD_SCHEME "SHA1"
 
 unsigned int auth_request_state_count[AUTH_REQUEST_STATE_MAX];
@@ -1473,14 +1474,20 @@
 	const char *host;
 	unsigned int i;
 
+	host = auth_stream_reply_find(request->extra_fields, "host");
+	i_assert(host != NULL);
+
 	if (result->ret != 0) {
-		host = auth_stream_reply_find(request->extra_fields, "host");
-		i_assert(host != NULL);
-		auth_request_log_error(request, "dns",
-			"dns_lookup(%s) failed: %s", host, result->error);
+		auth_request_log_error(request, "proxy",
+			"DNS lookup for %s failed: %s", host, result->error);
 		request->internal_failure = TRUE;
 		auth_request_proxy_finish_failure(request);
 	} else {
+		if (result->msecs > AUTH_DNS_WARN_MSECS) {
+			auth_request_log_warning(request, "proxy",
+				"DNS lookup for %s took %u.%03u s",
+				host, result->msecs/1000, result->msecs % 1000);
+		}
 		auth_stream_reply_remove(request->extra_fields, "host");
 		auth_stream_reply_add(request->extra_fields, "host",
 				      net_ip2addr(&result->ips[0]));
@@ -1503,8 +1510,9 @@
 {
 	struct auth_request_proxy_dns_lookup_ctx *ctx;
 	struct dns_lookup_settings dns_set;
-	const char *host;
+	const char *host, *value;
 	struct ip_addr ip;
+	unsigned int secs;
 
 	host = auth_stream_reply_find(request->extra_fields, "host");
 	if (host == NULL)
@@ -1518,7 +1526,16 @@
 	/* need to do dns lookup for the host */
 	memset(&dns_set, 0, sizeof(dns_set));
 	dns_set.dns_client_socket_path = AUTH_DNS_SOCKET_PATH;
-	dns_set.timeout_msecs = AUTH_DNS_TIMEOUT_MSECS;
+	dns_set.timeout_msecs = AUTH_DNS_DEFAULT_TIMEOUT_MSECS;
+	value = auth_stream_reply_find(request->extra_fields, "proxy_timeout");
+	if (value != NULL) {
+		if (str_to_uint(value, &secs) < 0) {
+			auth_request_log_error(request, "proxy",
+				"Invalid proxy_timeout value: %s", value);
+		} else {
+			dns_set.timeout_msecs = secs*1000;
+		}
+	}
 
 	ctx = i_new(struct auth_request_proxy_dns_lookup_ctx, 1);
 	ctx->request = request;


More information about the dovecot-cvs mailing list