dovecot-2.1: director: Expire users a bit more correctly.

dovecot at dovecot.org dovecot at dovecot.org
Mon Jul 29 22:19:13 EEST 2013


details:   http://hg.dovecot.org/dovecot-2.1/rev/df041f75b6da
changeset: 14983:df041f75b6da
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Jul 29 22:08:26 2013 +0300
description:
director: Expire users a bit more correctly.
Also make sure that the "user near expiring" interval is at least 3 seconds
in case director_user_expire is very low.

diffstat:

 src/director/user-directory.c |  20 +++++++++++++++-----
 1 files changed, 15 insertions(+), 5 deletions(-)

diffs (59 lines):

diff -r fcdbadcb9801 -r df041f75b6da src/director/user-directory.c
--- a/src/director/user-directory.c	Mon Jul 29 22:06:13 2013 +0300
+++ b/src/director/user-directory.c	Mon Jul 29 22:08:26 2013 +0300
@@ -11,7 +11,8 @@
 
 /* n% of timeout_secs */
 #define USER_NEAR_EXPIRING_PERCENTAGE 10
-/* but max. of this many secs */
+/* but min/max. of this many secs */
+#define USER_NEAR_EXPIRING_MIN 3
 #define USER_NEAR_EXPIRING_MAX 30
 
 struct user_directory_iter {
@@ -65,7 +66,7 @@
 {
 	time_t expire_timestamp = user->timestamp + dir->timeout_secs;
 
-	if (expire_timestamp >= ioloop_time)
+	if (expire_timestamp > ioloop_time)
 		return TRUE;
 
 	if (user->kill_state != USER_KILL_STATE_NONE) {
@@ -93,9 +94,15 @@
 struct user *user_directory_lookup(struct user_directory *dir,
 				   unsigned int username_hash)
 {
+	struct user *user;
+
 	user_directory_drop_expired(dir);
-
-	return hash_table_lookup(dir->hash, POINTER_CAST(username_hash));
+	user = hash_table_lookup(dir->hash, POINTER_CAST(username_hash));
+	if (user != NULL && !user_directory_user_has_connections(dir, user)) {
+		user_free(dir, user);
+		user = NULL;
+	}
+	return user;
 }
 
 static void
@@ -230,6 +237,8 @@
 {
 	struct user_directory *dir;
 
+	i_assert(timeout_secs > USER_NEAR_EXPIRING_MIN);
+
 	dir = i_new(struct user_directory, 1);
 	dir->timeout_secs = timeout_secs;
 	dir->user_near_expiring_secs =
@@ -237,7 +246,8 @@
 	dir->user_near_expiring_secs =
 		I_MIN(dir->user_near_expiring_secs, USER_NEAR_EXPIRING_MAX);
 	dir->user_near_expiring_secs =
-		I_MAX(dir->user_near_expiring_secs, 1);
+		I_MAX(dir->user_near_expiring_secs, USER_NEAR_EXPIRING_MIN);
+	i_assert(dir->timeout_secs/2 > dir->user_near_expiring_secs);
 
 	dir->username_hash_fmt = i_strdup(username_hash_fmt);
 	dir->hash = hash_table_create(default_pool, default_pool,


More information about the dovecot-cvs mailing list