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
