From 19cbf2b8a49d18eb8a8047c3b03953e6e9f0116f Mon Sep 17 00:00:00 2001 From: Gurucharan Shetty Date: Wed, 10 Apr 2013 15:09:00 -0700 Subject: [PATCH] debian: force-reload-kmod while package upgrading. 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 --- debian/openvswitch-switch.init | 31 +++++++++++++++++++++++++++--- debian/openvswitch-switch.postinst | 7 ++++--- utilities/ovs-lib.in | 4 ++++ 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/debian/openvswitch-switch.init b/debian/openvswitch-switch.init index d84c1b671..84aa45035 100755 --- a/debian/openvswitch-switch.init +++ b/debian/openvswitch-switch.init @@ -75,10 +75,35 @@ 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 + + if [ -e /sys/module/openvswitch ]; then + LOADED_SRCVERSION=`cat /sys/module/openvswitch/srcversion` + LOADED_VERSION=`cat /sys/module/openvswitch/version` + elif [ -e /sys/module/openvswitch_mod ]; then + LOADED_SRCVERSION=`cat /sys/module/openvswitch_mod/srcversion` + LOADED_VERSION=`cat /sys/module/openvswitch_mod/version` + fi + SRCVERSION=`modinfo -F srcversion openvswitch 2>/dev/null` + VERSION=`modinfo -F version openvswitch 2>/dev/null` + + ovs_ctl_log "Package upgrading:\n"\ + "Loaded version: ${LOADED_VERSION} ${LOADED_SRCVERSION}.\n"\ + "Version on disk: ${VERSION} ${SRCVERSION}." + + # 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_SRCVERSION}" ] && [ -n "${SRCVERSION}" ] && \ + [ "${SRCVERSION}" != "${LOADED_SRCVERSION}" ]; 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 ac6ed653a..246457249 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 f7b5bd470..1684ddcdd 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"*) -- 2.43.0