Looks good. Ethan
On Wed, Nov 23, 2011 at 12:15, Ben Pfaff <b...@nicira.com> wrote: > 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 <m...@nicira.com> > Bug #8457. > --- > lib/daemon.c | 23 ++++++++++++++--------- > python/ovs/daemon.py | 18 ++++++++++++------ > 2 files changed, 26 insertions(+), 15 deletions(-) > > diff --git a/lib/daemon.c b/lib/daemon.c > index ef1a24e..3dd5a1a 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 5937877..0d119f2 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) > -- > 1.7.4.4 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev