Wait for daemons to die in init.d script "stop" commands.
authorBen Pfaff <blp@nicira.com>
Thu, 12 Aug 2010 17:18:19 +0000 (10:18 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 12 Aug 2010 18:15:20 +0000 (11:15 -0700)
Sometimes it takes a moment for the OVS daemons to die.  When that happens,
the "start" half of "openvswitch restart" can fail when ovsdb-tool
runs, because ovsdb-server will still have the lock on the database if it
has not exited yet.  So this commit just makes the "stop" half wait for
the daemons to really die.

Bug #3369.

debian/openvswitch-switch.init
xenserver/etc_init.d_openvswitch

index a5b6857..a933a21 100755 (executable)
@@ -273,13 +273,13 @@ case "$1" in
         ;;
     stop)
         echo -n "Stopping ovs-vswitchd: "
         ;;
     stop)
         echo -n "Stopping ovs-vswitchd: "
-        start-stop-daemon --stop --quiet --oknodo \
+        start-stop-daemon --stop --quiet --oknodo --retry 5 \
             --pidfile /var/run/openvswitch/ovs-vswitchd.pid \
             --exec $ovs_vswitchd
         echo "ovs-vswitchd."
 
         echo -n "Stopping ovsdb-server: "
             --pidfile /var/run/openvswitch/ovs-vswitchd.pid \
             --exec $ovs_vswitchd
         echo "ovs-vswitchd."
 
         echo -n "Stopping ovsdb-server: "
-        start-stop-daemon --stop --quiet --oknodo \
+        start-stop-daemon --stop --quiet --oknodo --retry 5 \
             --pidfile /var/run/openvswitch/ovsdb-server.pid \
             --exec $ovsdb_server
         echo "ovsdb-server."
             --pidfile /var/run/openvswitch/ovsdb-server.pid \
             --exec $ovsdb_server
         echo "ovsdb-server."
index 0988fcc..c52864e 100755 (executable)
@@ -254,6 +254,13 @@ function stop_daemon {
     if test -f "$pidfile"; then
         local pid=$(cat "$pidfile")
         action "Killing `basename $BINARY` ($pid)" kill $pid
     if test -f "$pidfile"; then
         local pid=$(cat "$pidfile")
         action "Killing `basename $BINARY` ($pid)" kill $pid
+        for delay in .1 .25 .65 1 1 1 1; do
+            if kill -0 $pid >/dev/null 2>&1; then
+                sleep $delay
+            else
+                break
+            fi
+        done
         rm -f "$pidfile"
     fi
 }
         rm -f "$pidfile"
     fi
 }