]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
master: Added support for stopping specific services.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 28 Jun 2016 20:38:11 +0000 (23:38 +0300)
committerGitLab <gitlab@git.dovecot.net>
Wed, 29 Jun 2016 16:15:03 +0000 (19:15 +0300)
We need to have a per-service fd for detecting a dead master.

src/master/service-monitor.c
src/master/service-process.c
src/master/service.c
src/master/service.h

index bf4e93124100e1668ec446961a4ed545675f3ec3..fb4f64f5b258cd78b696c5e60f230547e52ebe0a 100644 (file)
@@ -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
index 6883cc707281da13ca406bc31d532991d903bfc9..36b14065098725f4a0222baea564e61da033ea82 100644 (file)
@@ -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],
index 1bae79f8c7375c55675531220125bdb0060b480a..a8bc0af608d242413bb9691c22b77eccf5ce4653 100644 (file)
@@ -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);
index 5d624af1e34eb6b55b47d7f26765ff8f27c908b0..004a03f4b998faefde6fc40c8dbe4ee3745ba299 100644 (file)
@@ -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;