diff --git a/sbin/hastd/hastd.c b/sbin/hastd/hastd.c index 5af814b70fde..09c45bce3828 100644 --- a/sbin/hastd/hastd.c +++ b/sbin/hastd/hastd.c @@ -224,7 +224,8 @@ descriptors_assert(const struct hast_resource *res, int pjdlogmode) fd, dtype2str(mode), dtype2str(S_IFSOCK)); break; } - } else if (fd == proto_descriptor(res->hr_conn)) { + } else if (res->hr_role == HAST_ROLE_PRIMARY && + fd == proto_descriptor(res->hr_conn)) { if (!isopen) { (void)snprintf(msg, sizeof(msg), "Descriptor %d (conn) is closed, but should be open.", @@ -237,6 +238,15 @@ descriptors_assert(const struct hast_resource *res, int pjdlogmode) fd, dtype2str(mode), dtype2str(S_IFSOCK)); break; } + } else if (res->hr_role == HAST_ROLE_SECONDARY && + res->hr_conn != NULL && + fd == proto_descriptor(res->hr_conn)) { + if (isopen) { + (void)snprintf(msg, sizeof(msg), + "Descriptor %d (conn) is open, but should be closed.", + fd); + break; + } } else if (res->hr_role == HAST_ROLE_SECONDARY && fd == proto_descriptor(res->hr_remotein)) { if (!isopen) { @@ -851,6 +861,8 @@ connection_migrate(struct hast_resource *res) pjdlog_prefix_set("[%s] (%s) ", res->hr_name, role2str(res->hr_role)); + PJDLOG_ASSERT(res->hr_role == HAST_ROLE_PRIMARY); + if (proto_recv(res->hr_conn, &val, sizeof(val)) < 0) { pjdlog_errno(LOG_WARNING, "Unable to receive connection command"); @@ -951,17 +963,19 @@ main_loop(void) TAILQ_FOREACH(res, &cfg->hc_resources, hr_next) { if (res->hr_event == NULL) continue; - PJDLOG_ASSERT(res->hr_conn != NULL); fd = proto_descriptor(res->hr_event); PJDLOG_ASSERT(fd >= 0); FD_SET(fd, &rfds); maxfd = fd > maxfd ? fd : maxfd; if (res->hr_role == HAST_ROLE_PRIMARY) { /* Only primary workers asks for connections. */ + PJDLOG_ASSERT(res->hr_conn != NULL); fd = proto_descriptor(res->hr_conn); PJDLOG_ASSERT(fd >= 0); FD_SET(fd, &rfds); maxfd = fd > maxfd ? fd : maxfd; + } else { + PJDLOG_ASSERT(res->hr_conn == NULL); } } @@ -998,20 +1012,26 @@ main_loop(void) TAILQ_FOREACH(res, &cfg->hc_resources, hr_next) { if (res->hr_event == NULL) continue; - PJDLOG_ASSERT(res->hr_conn != NULL); if (FD_ISSET(proto_descriptor(res->hr_event), &rfds)) { if (event_recv(res) == 0) continue; /* The worker process exited? */ proto_close(res->hr_event); res->hr_event = NULL; - proto_close(res->hr_conn); - res->hr_conn = NULL; + if (res->hr_conn != NULL) { + proto_close(res->hr_conn); + res->hr_conn = NULL; + } continue; } - if (res->hr_role == HAST_ROLE_PRIMARY && - FD_ISSET(proto_descriptor(res->hr_conn), &rfds)) { - connection_migrate(res); + if (res->hr_role == HAST_ROLE_PRIMARY) { + PJDLOG_ASSERT(res->hr_conn != NULL); + if (FD_ISSET(proto_descriptor(res->hr_conn), + &rfds)) { + connection_migrate(res); + } + } else { + PJDLOG_ASSERT(res->hr_conn == NULL); } } } diff --git a/sbin/hastd/secondary.c b/sbin/hastd/secondary.c index 39aa40458865..714588facd80 100644 --- a/sbin/hastd/secondary.c +++ b/sbin/hastd/secondary.c @@ -378,16 +378,6 @@ hastd_secondary(struct hast_resource *res, struct nv *nvin) pjdlog_exit(EX_OSERR, "Unable to create event sockets between child and parent"); } - /* - * Create communication channel for sending connection requests from - * parent to child. - */ - if (proto_client(NULL, "socketpair://", &res->hr_conn) < 0) { - /* TODO: There's no need for this to be fatal error. */ - KEEP_ERRNO((void)pidfile_remove(pfh)); - pjdlog_exit(EX_OSERR, - "Unable to create connection sockets between parent and child"); - } pid = fork(); if (pid < 0) { @@ -405,7 +395,6 @@ hastd_secondary(struct hast_resource *res, struct nv *nvin) proto_recv(res->hr_event, NULL, 0); /* Declare that we are sender. */ proto_send(res->hr_ctrl, NULL, 0); - proto_send(res->hr_conn, NULL, 0); res->hr_workerpid = pid; return; } @@ -418,7 +407,6 @@ hastd_secondary(struct hast_resource *res, struct nv *nvin) proto_send(res->hr_event, NULL, 0); /* Declare that we are receiver. */ proto_recv(res->hr_ctrl, NULL, 0); - proto_recv(res->hr_conn, NULL, 0); descriptors_cleanup(res); descriptors_assert(res, mode);