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

Reply via email to