From 34642ccff3ad4906cd365d0cb3deaa1e4f16610b Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Wed, 4 Oct 2017 15:39:08 +0300 Subject: [PATCH] director: Fix tracking user move count when user is freed early users_moving_count wasn't updated if the user was freed before killing it finished. This caused "doveadm director flush" to hang while waiting for the move count to drop to 0, which it never did. Also following flushes were doing less work in parallel, or possibly even nothing since director thought there were too many users already being moved. --- src/director/director.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/director/director.c b/src/director/director.c index b7049c796e..423e941ed9 100644 --- a/src/director/director.c +++ b/src/director/director.c @@ -857,6 +857,14 @@ director_flush_user(struct director *dir, struct user *user) program_client_run_async(ctx->pclient, director_flush_user_continue, ctx); } +static void director_user_move_finished(struct director *dir) +{ + i_assert(dir->users_moving_count > 0); + dir->users_moving_count--; + + director_set_state_changed(dir); +} + static void director_user_move_free(struct user *user) { struct director *dir = user->kill_ctx->dir; @@ -872,10 +880,7 @@ static void director_user_move_free(struct user *user) i_free(kill_ctx); user->kill_ctx = NULL; - i_assert(dir->users_moving_count > 0); - dir->users_moving_count--; - - director_set_state_changed(dir); + director_user_move_finished(dir); } static void @@ -971,6 +976,7 @@ static void director_kill_user_callback(enum ipc_client_cmd_state state, if (!DIRECTOR_KILL_CONTEXT_IS_VALID(user, ctx)) { /* user was already freed - ignore */ i_assert(ctx->to_move == NULL); + director_user_move_finished(ctx->dir); i_free(ctx); } else { i_assert(ctx->kill_state == USER_KILL_STATE_KILLING || -- 2.47.3