[ovs-dev] [PATCH] daemon: Better log when fork child dies early from signals.
Ethan Jackson
ethan at nicira.com
Mon Nov 28 11:18:23 PST 2011
Looks good.
Ethan
On Wed, Nov 23, 2011 at 12:15, Ben Pfaff <blp at 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 <mhu at 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 at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>
More information about the dev
mailing list