From 0fb6d16959814545066e7956aa7922eb3119d2e5 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Thu, 30 Jun 2016 14:08:24 +0300 Subject: [PATCH] master: Stopping didn't close dead-pipes early enough. This caused stopping to be too slow. Broken by 0153cf542. --- src/master/service-monitor.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/master/service-monitor.c b/src/master/service-monitor.c index 19655c2c39..44cdb2696b 100644 --- a/src/master/service-monitor.c +++ b/src/master/service-monitor.c @@ -505,6 +505,14 @@ void services_monitor_start(struct service_list *service_list) } } +static void service_monitor_close_dead_pipe(struct service *service) +{ + if (service->master_dead_pipe_fd[0] != -1) { + i_close_fd(&service->master_dead_pipe_fd[0]); + i_close_fd(&service->master_dead_pipe_fd[1]); + } +} + void service_monitor_stop(struct service *service) { int i; @@ -522,10 +530,7 @@ void service_monitor_stop(struct service *service) service->status_fd[i] = -1; } } - if (service->master_dead_pipe_fd[0] != -1) { - i_close_fd(&service->master_dead_pipe_fd[0]); - i_close_fd(&service->master_dead_pipe_fd[1]); - } + service_monitor_close_dead_pipe(service); if (service->login_notify_fd != -1) { if (close(service->login_notify_fd) < 0) { service_error(service, @@ -582,6 +587,9 @@ void services_monitor_stop(struct service_list *service_list, bool wait) { struct service *const *services; + array_foreach(&service_list->services, services) + service_monitor_close_dead_pipe(*services); + if (wait) { /* we've notified all children that the master is dead. now wait for the children to either die or to tell that -- 2.47.3