changeset 16617:0e0eb964685a

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.
author Timo Sirainen <tss@iki.fi>
date Mon, 29 Jul 2013 22:08:26 +0300
parents d95ca476098c
children 0ad8da149774
files src/director/user-directory.c
diffstat 1 files changed, 15 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- 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)
 {
-	user_directory_drop_expired(dir);
+	struct user *user;
 
-	return hash_table_lookup(dir->hash, POINTER_CAST(username_hash));
+	user_directory_drop_expired(dir);
+	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);
 	hash_table_create_direct(&dir->hash, default_pool, 0);