dovecot-2.2: director: Expire users a bit more correctly.
dovecot at dovecot.org
dovecot at dovecot.org
Mon Jul 29 22:19:17 EEST 2013
details: http://hg.dovecot.org/dovecot-2.2/rev/0e0eb964685a
changeset: 16617:0e0eb964685a
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 d95ca476098c -r 0e0eb964685a 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);
hash_table_create_direct(&dir->hash, default_pool, 0);
More information about the dovecot-cvs
mailing list