Author: pjd
Date: Wed Mar 23 11:09:04 2011
New Revision: 219900
URL: http://svn.freebsd.org/changeset/base/219900

Log:
  Don't create socketpair for connection forwarding between parent and 
secondary.
  Secondary doesn't need to connect anywhere.
  
  MFC after:    1 week

Modified:
  head/sbin/hastd/hastd.c
  head/sbin/hastd/secondary.c

Modified: head/sbin/hastd/hastd.c
==============================================================================
--- head/sbin/hastd/hastd.c     Wed Mar 23 08:33:12 2011        (r219899)
+++ head/sbin/hastd/hastd.c     Wed Mar 23 11:09:04 2011        (r219900)
@@ -224,7 +224,8 @@ descriptors_assert(const struct hast_res
                                    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_res
                                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 
 
        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);
                        }
                }
        }

Modified: head/sbin/hastd/secondary.c
==============================================================================
--- head/sbin/hastd/secondary.c Wed Mar 23 08:33:12 2011        (r219899)
+++ head/sbin/hastd/secondary.c Wed Mar 23 11:09:04 2011        (r219900)
@@ -378,16 +378,6 @@ hastd_secondary(struct hast_resource *re
                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 *re
                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 *re
        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);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to