[ovs-dev] [PATCH v3] debian: force-reload-kmod while package upgrading.

Gurucharan Shetty shettyg at nicira.com
Mon Apr 22 23:50:19 UTC 2013


Currently, when we upgrade openvswitch packages, we do a restart
of userspace daemons automatically. This does not replace the
kernel module.

But almost everytime, we want to use the new kernel module
that comes with the new version. This means that we need to
manually do a "force-reload-kmod". This step, reloads the
kernel module and also restarts the userspace daemons. This gives
us a total of two restarts of userspace daemons. This is quite
expensive in a hypervisor with hundreds of VMs sending real traffic.
This also hurts the controller as it gets two reconnections in a short
amount of time.

With this patch, during a package upgrade, if the kernel module
on disk is different than the one that is loaded, we will
automatically do a force-reload-kmod while openvswitch-switch
is installed. If not, we will just do a "restart" like before.

One can install the kernel package first and then install the userspace
packages in 2 separate steps to enforce a single 'force-reload-kmod'.

If anyone wants to just restart the userspace package instead of
force-reload-kmod, they can set the value of OVS_FORCE_RELOAD_KMOD=no
while installing the package.
Ex: OVS_FORCE_RELOAD_KMOD=no dpkg -i openvswitch-switch*

Signed-off-by: Gurucharan Shetty <gshetty at nicira.com>
---
 debian/openvswitch-switch.init     |   22 +++++++++++++++++++---
 debian/openvswitch-switch.postinst |    7 ++++---
 utilities/ovs-lib.in               |    4 ++++
 3 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/debian/openvswitch-switch.init b/debian/openvswitch-switch.init
index d84c1b6..94361e2 100755
--- a/debian/openvswitch-switch.init
+++ b/debian/openvswitch-switch.init
@@ -75,10 +75,26 @@ stop () {
 }
 
 restart () {
-    # OVS_RESTART_SAVE_FLOWS can be set by package postinst script.
-    if [ "$OVS_RESTART_SAVE_FLOWS" = "yes" ] || \
-       [ "$1" = "--save-flows=yes" ]; then
+    # OVS_FORCE_RELOAD_KMOD can be set by package postinst script.
+    if [ "$1" = "--save-flows=yes" ] || \
+        [ "${OVS_FORCE_RELOAD_KMOD}" = "no" ]; then
         start restart
+    elif [ "${OVS_FORCE_RELOAD_KMOD}" = "yes" ]; then
+        depmod -a
+        VERSION=`modinfo -F version openvswitch 2>/dev/null`
+        LOADED_VERSION=`cat /sys/module/openvswitch/version 2>/dev/null`
+
+        ovs_ctl_log "Package upgrading:\n"\
+                    "Loaded version is ${LOADED_VERSION}. "\
+                    "Version on disk is ${VERSION}."
+        # If the kernel module was previously loaded and it is different than
+        # the kernel module on disk, then do a 'force-reload-kmod'.
+        if [ -n "${LOADED_VERSION}" ] && [ -n "${VERSION}" ] && \
+            [ "${VERSION}" != "${LOADED_VERSION}" ]; then
+            start force-reload-kmod
+        else
+            start restart
+        fi
     else
         stop
         start
diff --git a/debian/openvswitch-switch.postinst b/debian/openvswitch-switch.postinst
index ac6ed65..2464572 100755
--- a/debian/openvswitch-switch.postinst
+++ b/debian/openvswitch-switch.postinst
@@ -49,9 +49,10 @@ esac
 OVS_MISSING_KMOD_OK=yes
 export OVS_MISSING_KMOD_OK
 
-# Save and restore openflow flows during a package upgrade.
-OVS_RESTART_SAVE_FLOWS=yes
-export OVS_RESTART_SAVE_FLOWS
+# force-reload-kmod during upgrade. If a user wants to override this,
+# they can set the variable OVS_FORCE_RELOAD_KMOD=no while installing.
+[ -z "${OVS_FORCE_RELOAD_KMOD}" ] && OVS_FORCE_RELOAD_KMOD=yes || true
+export OVS_FORCE_RELOAD_KMOD
 
 #DEBHELPER#
 
diff --git a/utilities/ovs-lib.in b/utilities/ovs-lib.in
index f7b5bd4..1684ddc 100644
--- a/utilities/ovs-lib.in
+++ b/utilities/ovs-lib.in
@@ -37,6 +37,10 @@ else
     dbdir='@DBDIR@'
 fi
 
+ovs_ctl_log () {
+    echo "$@" >> "${logdir}/ovs-ctl.log"
+}
+
 ovs_ctl () {
     case "$@" in
         *"=strace"*)
-- 
1.7.9.5




More information about the dev mailing list