From: Timo Sirainen Date: Tue, 19 Sep 2017 22:47:38 +0000 (+0300) Subject: director: Fix flush to kick the user also when all backends are down X-Git-Tag: 2.3.0.rc1~990 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ce8d63810932f48176304ed08cd8b7652c4a8add;p=thirdparty%2Fdovecot%2Fcore.git director: Fix flush to kick the user also when all backends are down The user's host can't change, because there are no other hosts. So add a new parameter to force the kick anyway. --- diff --git a/src/director/director.c b/src/director/director.c index 315ccb87d3..ebd86d0e7d 100644 --- a/src/director/director.c +++ b/src/director/director.c @@ -1013,7 +1013,7 @@ static void director_user_move_timeout(struct user *user) void director_kill_user(struct director *dir, struct director_host *src, struct user *user, struct mail_tag *tag, - struct mail_host *old_host) + struct mail_host *old_host, bool forced_kick) { struct director_kill_context *ctx; const char *cmd; @@ -1044,7 +1044,7 @@ void director_kill_user(struct director *dir, struct director_host *src, director_user_move_timeout, user); ctx->kill_state = USER_KILL_STATE_KILLING; - if (old_host != NULL && old_host != user->host) { + if ((old_host != NULL && old_host != user->host) || forced_kick) { cmd = t_strdup_printf("proxy\t*\tKICK-DIRECTOR-HASH\t%u", user->username_hash); ctx->callback_pending = TRUE; @@ -1124,7 +1124,7 @@ void director_move_user(struct director *dir, struct director_host *src, user->username_hash, net_ip2addr(&user->host->ip))); /* kill the user only after sending the USER-MOVE, because the kill may finish instantly. */ - director_kill_user(dir, src, user, host->tag, old_host); + director_kill_user(dir, src, user, host->tag, old_host, FALSE); } static void diff --git a/src/director/director.h b/src/director/director.h index 383fa83f5a..bfd37e6125 100644 --- a/src/director/director.h +++ b/src/director/director.h @@ -203,7 +203,7 @@ void director_update_user_weak(struct director *dir, struct director_host *src, struct user *user) ATTR_NULL(3); void director_kill_user(struct director *dir, struct director_host *src, struct user *user, struct mail_tag *tag, - struct mail_host *old_host); + struct mail_host *old_host, bool forced_kick); void director_move_user(struct director *dir, struct director_host *src, struct director_host *orig_src, unsigned int username_hash, struct mail_host *host) diff --git a/src/director/doveadm-connection.c b/src/director/doveadm-connection.c index d54f6005b2..0ed43882d6 100644 --- a/src/director/doveadm-connection.c +++ b/src/director/doveadm-connection.c @@ -512,7 +512,8 @@ director_host_reset_users(struct director_reset_cmd *cmd, /* there are no more available backends. kick the user instead. */ director_kill_user(dir, dir->self_host, user, - user->host->tag, user->host); + user->host->tag, user->host, + TRUE); users_killed = TRUE; } } T_END;