Skip to content

Commit

Permalink
director: Fix HOST-RESET-USERS when all hosts are down
Browse files Browse the repository at this point in the history
If there were a lot of users being kicked, the host was flushed after the
initial round of user kills. This caused the rest of the user connections to
be just discarded instead of actually being killed.
  • Loading branch information
sirainen committed Oct 4, 2017
1 parent 34642cc commit 6c76bcb
Showing 1 changed file with 11 additions and 8 deletions.
19 changes: 11 additions & 8 deletions src/director/doveadm-connection.c
Expand Up @@ -49,6 +49,7 @@ struct director_reset_cmd {
struct director_user_iter *iter;
unsigned int host_idx, hosts_count;
unsigned int max_moving_users;
bool users_killed;
};

struct doveadm_connection {
Expand Down Expand Up @@ -486,16 +487,17 @@ director_host_reset_users(struct director_reset_cmd *cmd,
struct director *dir = cmd->dir;
struct user *user;
struct mail_host *new_host;
bool users_killed = FALSE;

if (dir->users_moving_count >= cmd->max_moving_users)
return FALSE;

if (dir->right != NULL)
director_connection_cork(dir->right);

if (cmd->iter == NULL)
if (cmd->iter == NULL) {
cmd->iter = director_iterate_users_init(dir);
cmd->users_killed = FALSE;
}

while ((user = director_iterate_users_next(cmd->iter)) != NULL) {
if (user->host != host)
Expand All @@ -514,18 +516,19 @@ director_host_reset_users(struct director_reset_cmd *cmd,
director_kill_user(dir, dir->self_host, user,
user->host->tag, user->host,
TRUE);
users_killed = TRUE;
cmd->users_killed = TRUE;
}
} T_END;
if (dir->users_moving_count >= cmd->max_moving_users)
break;
}
if (user == NULL)
if (user == NULL) {
director_iterate_users_deinit(&cmd->iter);
if (users_killed) {
/* no more backends. we already sent kills. now remove the
users entirely from the host. */
director_flush_host(dir, dir->self_host, NULL, host);
if (cmd->users_killed) {
/* no more backends. we already sent kills. now remove
the users entirely from the host. */
director_flush_host(dir, dir->self_host, NULL, host);
}
}
if (dir->right != NULL)
director_connection_uncork(dir->right);
Expand Down

0 comments on commit 6c76bcb

Please sign in to comment.