From 4187b0f718f33277b378fc6feb12b70447f2daab 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 1a4b5a45a7..b1ccb5fa24 100644 --- a/src/director/director.c +++ b/src/director/director.c @@ -835,6 +835,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; @@ -851,10 +859,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 @@ -950,6 +955,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