Skip to content

Commit 0153cf5

Browse files
sirainenGitLab
authored and
GitLab
committed
master: Added support for stopping specific services.
We need to have a per-service fd for detecting a dead master.
1 parent 9881c3e commit 0153cf5

File tree

4 files changed

+17
-19
lines changed

4 files changed

+17
-19
lines changed

src/master/service-monitor.c

+12-14
Original file line numberDiff line numberDiff line change
@@ -452,18 +452,21 @@ void services_monitor_start(struct service_list *service_list)
452452
return;
453453
service_anvil_monitor_start(service_list);
454454

455-
if (pipe(service_list->master_dead_pipe_fd) < 0)
456-
i_error("pipe() failed: %m");
457-
fd_close_on_exec(service_list->master_dead_pipe_fd[0], TRUE);
458-
fd_close_on_exec(service_list->master_dead_pipe_fd[1], TRUE);
459-
460455
array_foreach(&service_list->services, services) {
461456
struct service *service = *services;
462457

463458
if (service->type == SERVICE_TYPE_LOGIN) {
464459
if (service_login_create_notify_fd(service) < 0)
465460
continue;
466461
}
462+
if (service->master_dead_pipe_fd[0] == -1) {
463+
if (pipe(service->master_dead_pipe_fd) < 0) {
464+
service_error(service, "pipe() failed: %m");
465+
continue;
466+
}
467+
fd_close_on_exec(service->master_dead_pipe_fd[0], TRUE);
468+
fd_close_on_exec(service->master_dead_pipe_fd[1], TRUE);
469+
}
467470
if (service->status_fd[0] == -1) {
468471
/* we haven't yet created status pipe */
469472
if (pipe(service->status_fd) < 0) {
@@ -519,6 +522,10 @@ void service_monitor_stop(struct service *service)
519522
service->status_fd[i] = -1;
520523
}
521524
}
525+
if (service->master_dead_pipe_fd[0] != -1) {
526+
i_close_fd(&service->master_dead_pipe_fd[0]);
527+
i_close_fd(&service->master_dead_pipe_fd[1]);
528+
}
522529
if (service->login_notify_fd != -1) {
523530
if (close(service->login_notify_fd) < 0) {
524531
service_error(service,
@@ -561,15 +568,6 @@ void services_monitor_stop(struct service_list *service_list, bool wait)
561568
{
562569
struct service *const *services;
563570

564-
if (service_list->master_dead_pipe_fd[0] != -1) {
565-
if (close(service_list->master_dead_pipe_fd[0]) < 0)
566-
i_error("close(master dead pipe) failed: %m");
567-
if (close(service_list->master_dead_pipe_fd[1]) < 0)
568-
i_error("close(master dead pipe) failed: %m");
569-
service_list->master_dead_pipe_fd[0] = -1;
570-
service_list->master_dead_pipe_fd[1] = -1;
571-
}
572-
573571
if (wait) {
574572
/* we've notified all children that the master is dead.
575573
now wait for the children to either die or to tell that

src/master/service-process.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ service_dup_fds(struct service *service)
133133
}
134134
dup2_append(&dups, service->status_fd[1], MASTER_STATUS_FD);
135135
if (service->type != SERVICE_TYPE_ANVIL) {
136-
dup2_append(&dups, service->list->master_dead_pipe_fd[1],
136+
dup2_append(&dups, service->master_dead_pipe_fd[1],
137137
MASTER_DEAD_FD);
138138
} else {
139139
dup2_append(&dups, global_master_dead_pipe_fd[1],

src/master/service.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,8 @@ service_create(pool_t pool, const struct service_settings *set,
283283
service->log_fd[1] = -1;
284284
service->status_fd[0] = -1;
285285
service->status_fd[1] = -1;
286+
service->master_dead_pipe_fd[0] = -1;
287+
service->master_dead_pipe_fd[1] = -1;
286288
service->log_process_internal_fd = -1;
287289
service->login_notify_fd = -1;
288290

@@ -424,8 +426,6 @@ services_create_real(const struct master_settings *set, pool_t pool,
424426
service_list->set = set;
425427
service_list->master_log_fd[0] = -1;
426428
service_list->master_log_fd[1] = -1;
427-
service_list->master_dead_pipe_fd[0] = -1;
428-
service_list->master_dead_pipe_fd[1] = -1;
429429

430430
service_settings = array_get(&set->services, &count);
431431
p_array_init(&service_list->services, pool, count);

src/master/service.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ struct service {
8585
int status_fd[2];
8686
struct io *io_status;
8787

88+
int master_dead_pipe_fd[2];
89+
8890
unsigned int throttle_secs;
8991
time_t exit_failure_last;
9092
unsigned int exit_failures_in_sec;
@@ -139,8 +141,6 @@ struct service_list {
139141
int master_log_fd[2];
140142
struct service_process_notify *log_byes;
141143

142-
int master_dead_pipe_fd[2];
143-
144144
ARRAY(struct service *) services;
145145

146146
bool destroying:1;

0 commit comments

Comments
 (0)