changeset 20854:e706c8ff0922

auth: Don't re-insert userdb results from auth cache data back to cache. This was also breaking TTLs for the cached userdb results, because each re-insert reset the TTL.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Tue, 11 Oct 2016 13:18:53 +0300
parents ec2d92883d82
children 0b12b2cb67dd
files src/auth/auth-request.c src/auth/auth-request.h
diffstat 2 files changed, 8 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/auth/auth-request.c	Mon Oct 10 21:22:15 2016 +0300
+++ b/src/auth/auth-request.c	Tue Oct 11 13:18:53 2016 +0300
@@ -1327,9 +1327,10 @@
 
 	if (request->userdb_lookup_tempfailed) {
 		/* no caching */
-	} else if (result != USERDB_RESULT_INTERNAL_FAILURE)
-		auth_request_userdb_save_cache(request, result);
-	else if (passdb_cache != NULL && userdb->cache_key != NULL) {
+	} else if (result != USERDB_RESULT_INTERNAL_FAILURE) {
+		if (!request->userdb_result_from_cache)
+			auth_request_userdb_save_cache(request, result);
+	} else if (passdb_cache != NULL && userdb->cache_key != NULL) {
 		/* lookup failed. if we're looking here only because the
 		   request was expired in cache, fallback to using cached
 		   expired record. */
@@ -1353,6 +1354,7 @@
 
 	request->private_callback.userdb = callback;
 	request->userdb_lookup = TRUE;
+	request->userdb_result_from_cache = FALSE;
 	if (request->userdb_reply == NULL)
 		auth_request_init_userdb_reply(request);
 	else {
@@ -1369,6 +1371,7 @@
 
 		if (auth_request_lookup_user_cache(request, cache_key,
 						   &result, FALSE)) {
+			request->userdb_result_from_cache = TRUE;
 			auth_request_userdb_callback(result, request);
 			return;
 		}
--- a/src/auth/auth-request.h	Mon Oct 10 21:22:15 2016 +0300
+++ b/src/auth/auth-request.h	Tue Oct 11 13:18:53 2016 +0300
@@ -144,6 +144,8 @@
 	/* userdb_* fields have been set by the passdb lookup, userdb prefetch
 	   will work. */
 	unsigned int userdb_prefetch_set:1;
+	/* userdb lookup's results are from cache */
+	unsigned int userdb_result_from_cache:1;
 	unsigned int stats_sent:1;
 	unsigned int policy_refusal:1;
 	unsigned int policy_processed:1;