On Tue, May 1, 2012 at 3:01 PM, Ben Pfaff <[email protected]> wrote:
> Thanks, I fixed the trailing whitespace.
>
> I also applied the following, which should fix up the packaging
> (thanks for pointing that out).  I tested the XenServer and Debian
> builds but not the RHEL ones.
>
> Any further comments?  Do you still plan to test this?
I tested this and it works fine on Xenserver and Ubuntu.
Looks good to me.

~Guru

>
> diff --git a/debian/openvswitch-switch.install 
> b/debian/openvswitch-switch.install
> index a7006ac..557429b 100644
> --- a/debian/openvswitch-switch.install
> +++ b/debian/openvswitch-switch.install
> @@ -6,6 +6,7 @@ usr/bin/ovs-vsctl
>  usr/bin/ovsdb-tool
>  usr/sbin/ovs-vswitchd
>  usr/sbin/ovsdb-server
> +usr/share/openvswitch/scripts/ovs-check-dead-ifs
>  usr/share/openvswitch/scripts/ovs-ctl
>  usr/share/openvswitch/scripts/ovs-lib
>  usr/share/openvswitch/scripts/ovs-save
> diff --git a/rhel/openvswitch.spec.in b/rhel/openvswitch.spec.in
> index e999757..00d1aa7 100644
> --- a/rhel/openvswitch.spec.in
> +++ b/rhel/openvswitch.spec.in
> @@ -146,6 +146,7 @@ exit 0
>  /usr/share/openvswitch/bugtool-plugins/
>  /usr/share/openvswitch/python/
>  /usr/share/openvswitch/scripts/ovs-bugtool-*
> +/usr/share/openvswitch/scripts/ovs-check-dead-ifs
>  /usr/share/openvswitch/scripts/ovs-ctl
>  /usr/share/openvswitch/scripts/ovs-lib
>  /usr/share/openvswitch/scripts/ovs-save
> diff --git a/xenserver/openvswitch-xen.spec.in 
> b/xenserver/openvswitch-xen.spec.in
> index 1e8d764..46b6f60 100644
> --- a/xenserver/openvswitch-xen.spec.in
> +++ b/xenserver/openvswitch-xen.spec.in
> @@ -407,6 +407,7 @@ exit 0
>  /etc/logrotate.d/openvswitch
>  /etc/profile.d/openvswitch.sh
>  /usr/share/openvswitch/python/
> +/usr/share/openvswitch/scripts/ovs-check-dead-ifs
>  /usr/share/openvswitch/scripts/ovs-xapi-sync
>  /usr/share/openvswitch/scripts/interface-reconfigure
>  /usr/share/openvswitch/scripts/InterfaceReconfigure.py
>
>
> On Mon, Apr 30, 2012 at 03:38:11PM -0700, Gurucharan Shetty wrote:
>> "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 <[email protected]> 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 <[email protected]>
>> > Signed-off-by: Ben Pfaff <[email protected]>
>> > ---
>> > 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
>> > [email protected]
>> > http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to