From 0153cf542884f8f50d17a0d909c2da98a37dafdc Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Tue, 28 Jun 2016 23:38:11 +0300 Subject: [PATCH] master: Added support for stopping specific services. We need to have a per-service fd for detecting a dead master. --- src/master/service-monitor.c | 26 ++++++++++++-------------- src/master/service-process.c | 2 +- src/master/service.c | 4 ++-- src/master/service.h | 4 ++-- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/master/service-monitor.c b/src/master/service-monitor.c index bf4e931241..fb4f64f5b2 100644 --- a/src/master/service-monitor.c +++ b/src/master/service-monitor.c @@ -452,11 +452,6 @@ void services_monitor_start(struct service_list *service_list) return; service_anvil_monitor_start(service_list); - if (pipe(service_list->master_dead_pipe_fd) < 0) - i_error("pipe() failed: %m"); - fd_close_on_exec(service_list->master_dead_pipe_fd[0], TRUE); - fd_close_on_exec(service_list->master_dead_pipe_fd[1], TRUE); - array_foreach(&service_list->services, services) { struct service *service = *services; @@ -464,6 +459,14 @@ void services_monitor_start(struct service_list *service_list) if (service_login_create_notify_fd(service) < 0) continue; } + if (service->master_dead_pipe_fd[0] == -1) { + if (pipe(service->master_dead_pipe_fd) < 0) { + service_error(service, "pipe() failed: %m"); + continue; + } + fd_close_on_exec(service->master_dead_pipe_fd[0], TRUE); + fd_close_on_exec(service->master_dead_pipe_fd[1], TRUE); + } if (service->status_fd[0] == -1) { /* we haven't yet created status pipe */ if (pipe(service->status_fd) < 0) { @@ -519,6 +522,10 @@ 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]); + } if (service->login_notify_fd != -1) { if (close(service->login_notify_fd) < 0) { service_error(service, @@ -561,15 +568,6 @@ void services_monitor_stop(struct service_list *service_list, bool wait) { struct service *const *services; - if (service_list->master_dead_pipe_fd[0] != -1) { - if (close(service_list->master_dead_pipe_fd[0]) < 0) - i_error("close(master dead pipe) failed: %m"); - if (close(service_list->master_dead_pipe_fd[1]) < 0) - i_error("close(master dead pipe) failed: %m"); - service_list->master_dead_pipe_fd[0] = -1; - service_list->master_dead_pipe_fd[1] = -1; - } - if (wait) { /* we've notified all children that the master is dead. now wait for the children to either die or to tell that diff --git a/src/master/service-process.c b/src/master/service-process.c index 6883cc7072..36b1406509 100644 --- a/src/master/service-process.c +++ b/src/master/service-process.c @@ -133,7 +133,7 @@ service_dup_fds(struct service *service) } dup2_append(&dups, service->status_fd[1], MASTER_STATUS_FD); if (service->type != SERVICE_TYPE_ANVIL) { - dup2_append(&dups, service->list->master_dead_pipe_fd[1], + dup2_append(&dups, service->master_dead_pipe_fd[1], MASTER_DEAD_FD); } else { dup2_append(&dups, global_master_dead_pipe_fd[1], diff --git a/src/master/service.c b/src/master/service.c index 1bae79f8c7..a8bc0af608 100644 --- a/src/master/service.c +++ b/src/master/service.c @@ -283,6 +283,8 @@ service_create(pool_t pool, const struct service_settings *set, service->log_fd[1] = -1; service->status_fd[0] = -1; service->status_fd[1] = -1; + service->master_dead_pipe_fd[0] = -1; + service->master_dead_pipe_fd[1] = -1; service->log_process_internal_fd = -1; service->login_notify_fd = -1; @@ -424,8 +426,6 @@ services_create_real(const struct master_settings *set, pool_t pool, service_list->set = set; service_list->master_log_fd[0] = -1; service_list->master_log_fd[1] = -1; - service_list->master_dead_pipe_fd[0] = -1; - service_list->master_dead_pipe_fd[1] = -1; service_settings = array_get(&set->services, &count); p_array_init(&service_list->services, pool, count); diff --git a/src/master/service.h b/src/master/service.h index 5d624af1e3..004a03f4b9 100644 --- a/src/master/service.h +++ b/src/master/service.h @@ -85,6 +85,8 @@ struct service { int status_fd[2]; struct io *io_status; + int master_dead_pipe_fd[2]; + unsigned int throttle_secs; time_t exit_failure_last; unsigned int exit_failures_in_sec; @@ -139,8 +141,6 @@ struct service_list { int master_log_fd[2]; struct service_process_notify *log_byes; - int master_dead_pipe_fd[2]; - ARRAY(struct service *) services; bool destroying:1; -- 2.47.3