From: Timo Sirainen Date: Mon, 22 Oct 2012 12:29:27 +0000 (+0300) Subject: director: If user's weak-flag appears to have gotten stuck, unset it. X-Git-Tag: 2.2.alpha1~20^2~13 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d40c98b71de3acd7dd9e41178d449ca84d26e406;p=thirdparty%2Fdovecot%2Fcore.git director: If user's weak-flag appears to have gotten stuck, unset it. --- diff --git a/src/director/director-request.c b/src/director/director-request.c index 9479583dce..04130f33f4 100644 --- a/src/director/director-request.c +++ b/src/director/director-request.c @@ -91,6 +91,13 @@ static void director_request_timeout(struct director *dir) request->username_hash); errormsg = director_request_get_timeout_error(request, user, str); + if (user != NULL && + request->delay_reason == REQUEST_DELAY_WEAK) { + /* weakness appears to have gotten stuck. this is a + bug, but try to fix it for future requests by + removing the weakness. */ + user->weak = FALSE; + } array_delete(&dir->pending_requests, 0, 1); T_BEGIN { diff --git a/src/director/user-directory.c b/src/director/user-directory.c index 525de2a158..fa72279cb4 100644 --- a/src/director/user-directory.c +++ b/src/director/user-directory.c @@ -65,7 +65,22 @@ static bool user_directory_user_has_connections(struct user_directory *dir, { time_t expire_timestamp = user->timestamp + dir->timeout_secs; - return expire_timestamp >= ioloop_time; + if (expire_timestamp >= ioloop_time) + return TRUE; + + if (user->kill_state != USER_KILL_STATE_NONE) { + /* don't free this user until the kill is finished */ + return TRUE; + } + + if (user->weak) { + if (expire_timestamp + USER_NEAR_EXPIRING_MAX >= ioloop_time) + return TRUE; + + i_warning("User %u weakness appears to be stuck, removing it", + user->username_hash); + } + return FALSE; } static void user_directory_drop_expired(struct user_directory *dir)