summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2011-03-23 11:09:04 +0000
committerpjd <pjd@FreeBSD.org>2011-03-23 11:09:04 +0000
commit4845f0f34232026617a88683d9d09e53883b6b3d (patch)
tree3f4c900acd993d66c5159287125c2b5e294980aa
parent1c16fc718951e391368eea036d13db2c06f8fdc4 (diff)
downloadFreeBSD-src-4845f0f34232026617a88683d9d09e53883b6b3d.zip
FreeBSD-src-4845f0f34232026617a88683d9d09e53883b6b3d.tar.gz
Don't create socketpair for connection forwarding between parent and secondary.
Secondary doesn't need to connect anywhere. MFC after: 1 week
-rw-r--r--sbin/hastd/hastd.c36
-rw-r--r--sbin/hastd/secondary.c12
2 files changed, 28 insertions, 20 deletions
diff --git a/sbin/hastd/hastd.c b/sbin/hastd/hastd.c
index 5af814b..09c45bc 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.",
@@ -238,6 +239,15 @@ descriptors_assert(const struct hast_resource *res, int pjdlogmode)
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) {
(void)snprintf(msg, sizeof(msg),
@@ -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 39aa404..714588f 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);
OpenPOWER on IntegriCloud