Mercurial > dovecot > core-2.2
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);