aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2011-11-23 12:15:42 -0800
committerBen Pfaff <blp@nicira.com>2011-11-28 12:33:34 -0800
commit2c8fcc9cd6a7bbb948f6c79879e89c7ed791c9b1 (patch)
treef07cbb03ab1902ccd6897fbed6ef156add671a3c
parent2c5a6834513540a494bfb3bfc48b8a91c4126a11 (diff)
daemon: Better log when fork child dies early from signals.
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.
-rw-r--r--lib/daemon.c23
-rw-r--r--python/ovs/daemon.py18
2 files changed, 26 insertions, 15 deletions
diff --git a/lib/daemon.c b/lib/daemon.c
index ef1a24ef..3dd5a1ab 100644
--- a/lib/daemon.c
+++ b/lib/daemon.c
@@ -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;
diff --git a/python/ovs/daemon.py b/python/ovs/daemon.py
index 5937877c..0d119f20 100644
--- a/python/ovs/daemon.py
+++ b/python/ovs/daemon.py
@@ -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)