[ovs-dev] [PATCH] ovs-ctl: Make "force-reload-kmod" warn when DHCP clients must be restarted.

Gurucharan Shetty gshetty at nicira.com
Mon Apr 30 22:38:11 UTC 2012


"git am" gives whitespace warning.
I will give this a test.

Also, the xenserver rpm build fails. It probably expects the file in
the .spec.in file.

On Fri, Apr 27, 2012 at 3:55 PM, Ben Pfaff <blp at nicira.com> wrote:
> This should make it more obvious when the admin needs to restart a DHCP
> client (or other daemon).  Without this, unless the admin carefully reads
> the documentation, the first notice he gets about a need to restart the
> DHCP client can easily be when the lease expires and the machine drops off
> the network.
>
> Bug #5391.
> Suggested-by: Duffie Cooley <dcooley at nicira.com>
> Signed-off-by: Ben Pfaff <blp at nicira.com>
> ---
> I've tested the ovs-check-dead-ifs script but not the integration
> with ovs-ctl.
>
>  utilities/automake.mk           |    6 ++-
>  utilities/ovs-check-dead-ifs.in |   96 +++++++++++++++++++++++++++++++++++++++
>  utilities/ovs-ctl.8             |   14 ++++--
>  utilities/ovs-ctl.in            |    2 +
>  4 files changed, 112 insertions(+), 6 deletions(-)
>  create mode 100755 utilities/ovs-check-dead-ifs.in
>
> diff --git a/utilities/automake.mk b/utilities/automake.mk
> index 0e93ffb..711c75f 100644
> --- a/utilities/automake.mk
> +++ b/utilities/automake.mk
> @@ -13,10 +13,14 @@ bin_SCRIPTS += \
>        utilities/ovs-vlan-test
>  endif
>  noinst_SCRIPTS += utilities/ovs-pki-cgi
> -scripts_SCRIPTS += utilities/ovs-ctl utilities/ovs-save
> +scripts_SCRIPTS += \
> +       utilities/ovs-check-dead-ifs \
> +       utilities/ovs-ctl \
> +       utilities/ovs-save
>  scripts_DATA += utilities/ovs-lib
>
>  EXTRA_DIST += \
> +       utilities/ovs-check-dead-ifs.in \
>        utilities/ovs-ctl.in \
>        utilities/ovs-lib.in \
>        utilities/ovs-parse-leaks.in \
> diff --git a/utilities/ovs-check-dead-ifs.in b/utilities/ovs-check-dead-ifs.in
> new file mode 100755
> index 0000000..53185d6
> --- /dev/null
> +++ b/utilities/ovs-check-dead-ifs.in
> @@ -0,0 +1,96 @@
> +#! @PYTHON@
> +
> +import os
> +import re
> +import stat
> +import sys
> +
> +if "--help" in sys.argv:
> +    sys.stdout.write("""\
> +ovs-check-dead-ifs: Check for packet sockets for nonexistent network devices.
> +
> +One side effect of the "force-reload-kmod" command that reloads the
> +Open vSwitch kernel module is that all the network devices that the
> +Open vSwitch kernel module implemented get destroyed and then replaced
> +by new instances with the same names.  Unfortunately, programs that
> +are listening for packets on the original network devices will not
> +receive packets that arrive on the new instances.  This causes some
> +services, such as DHCP, to silently fail.  This program looks for such
> +problems and, if it finds any, prints information about programs that
> +are in such a state.  The system administrator should then take some
> +action to fix the problem, such as restarting these programs.
> +""")
> +    sys.exit(0)
> +elif len(sys.argv) > 1:
> +    sys.stderr.write("ovs-check-dead-ifs: no arguments or options accepted "
> +                     "(use --help for help)\n")
> +    sys.exit(1)
> +
> +# Get the set of all valid ifindexes.
> +#
> +# 0 is always valid for our purposes because it means "any interface".
> +valid_ifindexes = set([])
> +for ifname in os.listdir("/sys/class/net"):
> +    fn = "/sys/class/net/%s/ifindex" % ifname
> +    try:
> +        valid_ifindexes.add(int(open(fn).readline()))
> +    except IOError:
> +        pass
> +    except ValueError:
> +        print "%s: unexpected format\n" % fn
> +
> +# Get inodes for all packet sockets whose ifindexes don't exist.
> +invalid_inodes = set()
> +f = open("/proc/net/packet")
> +f.readline()                    # Skip header line.
> +for line in f:
> +    fields = line.split()
> +    ifindex = int(fields[4])
> +    if ifindex not in valid_ifindexes:
> +        invalid_inodes.add(int(fields[8]))
> +f.close()
> +
> +if not invalid_inodes:
> +    sys.exit(0)
> +
> +# Now find the processes that are using those packet sockets.
> +inode_re = re.compile(r'socket:\[([0-9]+)\]$')
> +bad_pids = set()
> +for pid in os.listdir("/proc"):
> +    try:
> +        pid = int(pid)
> +    except ValueError:
> +        continue
> +
> +    for fd in os.listdir("/proc/%d/fd" % pid):
> +        try:
> +            fd = int(fd)
> +        except ValueError:
> +            continue
> +
> +        try:
> +            s = os.stat("/proc/%d/fd/%d" % (pid, fd))
> +        except OSError:
> +            continue
> +
> +        if not stat.S_ISSOCK(s.st_mode):
> +            continue
> +
> +        try:
> +            linkname = os.readlink("/proc/%d/fd/%d" % (pid, fd))
> +        except OSError:
> +            continue
> +
> +        m = inode_re.match(linkname)
> +        if not m:
> +            continue
> +
> +        inode = int(m.group(1))
> +        if inode in invalid_inodes:
> +            bad_pids.add(pid)
> +
> +if bad_pids:
> +    print """
> +The following processes are listening for packets to arrive on network devices
> +that no longer exist. You may want to restart them."""
> +    os.execvp("ps", ["ps"] + ["%s" % pid for pid in bad_pids])
> diff --git a/utilities/ovs-ctl.8 b/utilities/ovs-ctl.8
> index 06ccfec..988b500 100644
> --- a/utilities/ovs-ctl.8
> +++ b/utilities/ovs-ctl.8
> @@ -261,11 +261,15 @@ reloads the kernel module and restarts the OVS daemons (including
>  .IP 6.
>  Restores the kernel configuration state that was saved in step 3.
>  .
> -.PP
> -The steps above are often enough to hot-upgrade a new kernel module
> -with only a few seconds of downtime.  DHCP is a common problem: if the
> -ISC DHCP client is running on an OVS internal interface, then it will
> -have to be restarted after completing the above procedure.
> +.IP 7.
> +Checks for daemons that may need to be restarted because they have
> +packet sockets that are listening on old instances of Open vSwitch
> +kernel interfaces and, if it finds any, prints a warning on stdout.
> +DHCP is a common example: if the ISC DHCP client is running on an OVS
> +internal interface, then it will have to be restarted after completing
> +the above procedure.  (It would be nice if \fBovs\-ctl\fR could restart
> +daemons automatically, but the details are far too specific to a
> +particular distribution and installation.)
>  .
>  .PP
>  \fBforce\-kmod\-reload\fR internally stops and starts OVS, so it
> diff --git a/utilities/ovs-ctl.in b/utilities/ovs-ctl.in
> index ed55834..6885382 100755
> --- a/utilities/ovs-ctl.in
> +++ b/utilities/ovs-ctl.in
> @@ -311,6 +311,8 @@ force_reload_kmod () {
>     log="logger -p daemon.$level -t ovs-save"
>     $log "force-reload-kmod interface restore script exited with status $rc:"
>     $log -f "$script"
> +
> +    "$datadir/scripts/ovs-check-dead-ifs"
>  }
>
>  ## --------------- ##
> --
> 1.7.2.5
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev



More information about the dev mailing list