daemon: Better log when fork child dies early from signals.
authorBen Pfaff <blp@nicira.com>
Wed, 23 Nov 2011 20:15:42 +0000 (12:15 -0800)
committerBen Pfaff <blp@nicira.com>
Mon, 28 Nov 2011 20:33:34 +0000 (12:33 -0800)
On one machine, "/etc/init.d/openvswitch-switch start" failed to start
with:

   ovs-vswitchd: fork child failed to signal startup (Success)
   Starting ovs-vswitchd ... failed!

"strace" revealed that the fork child was actually segfaulting, but the
message output didn't indicate that in any way.  This commit fixes the
log message (but not the segfault itself).

Reported-by: Michael Hu <mhu@nicira.com>
Bug #8457.

lib/daemon.c
python/ovs/daemon.py

index ef1a24ef1e350a0a65e8a93052d468cae1bced1e..3dd5a1abbf9ed1b4204ffeef2015301ac7bd2d68 100644 (file)
@@ -250,16 +250,21 @@ fork_and_wait_for_startup(int *fdp)
                 retval = waitpid(pid, &status, 0);
             } while (retval == -1 && errno == EINTR);
 
-            if (retval == pid
-                && WIFEXITED(status)
-                && WEXITSTATUS(status)) {
-                /* Child exited with an error.  Convey the same error to
-                 * our parent process as a courtesy. */
-                exit(WEXITSTATUS(status));
+            if (retval == pid) {
+                if (WIFEXITED(status) && WEXITSTATUS(status)) {
+                    /* Child exited with an error.  Convey the same error
+                     * to our parent process as a courtesy. */
+                    exit(WEXITSTATUS(status));
+                } else {
+                    char *status_msg = process_status_msg(status);
+                    VLOG_FATAL("fork child died before signaling startup (%s)",
+                               status_msg);
+                }
+            } else if (retval < 0) {
+                VLOG_FATAL("waitpid failed (%s)", strerror(errno));
+            } else {
+                NOT_REACHED();
             }
-
-            VLOG_FATAL("fork child failed to signal startup (%s)",
-                       strerror(errno));
         }
         close(fds[0]);
         *fdp = -1;
index 5937877c3e1e52cc8fca25555fa8210e2ab12be5..0d119f202588abf290006f6dbb8aeea0606de28a 100644 (file)
@@ -245,13 +245,19 @@ def _fork_and_wait_for_startup():
                 break
         if len(s) != 1:
             retval, status = _waitpid(pid, 0)
-            if (retval == pid and
-                os.WIFEXITED(status) and os.WEXITSTATUS(status)):
-                # Child exited with an error.  Convey the same error to
-                # our parent process as a courtesy.
-                sys.exit(os.WEXITSTATUS(status))
+            if retval == pid:
+                if os.WIFEXITED(status) and os.WEXITSTATUS(status):
+                    # Child exited with an error.  Convey the same error to
+                    # our parent process as a courtesy.
+                    sys.exit(os.WEXITSTATUS(status))
+                else:
+                    sys.stderr.write("fork child failed to signal "
+                                     "startup (%s)\n"
+                                     % ovs.process.status_msg(status))
             else:
-                sys.stderr.write("fork child failed to signal startup\n")
+                assert retval < 0
+                sys.stderr.write("waitpid failed (%s)\n"
+                                 % os.strerror(-retval))
                 sys.exit(1)
 
         os.close(rfd)