mirror of
https://github.com/openvswitch/ovs
synced 2025-10-25 15:07:05 +00:00
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@nicira.com>
144 lines
4.2 KiB
Bash
Executable File
144 lines
4.2 KiB
Bash
Executable File
#! /bin/sh
|
|
#
|
|
# Copyright (C) 2011, 2012 Nicira, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at:
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
### BEGIN INIT INFO
|
|
# Provides: openvswitch-switch
|
|
# Required-Start: $network $named $remote_fs $syslog
|
|
# Required-Stop: $remote_fs
|
|
# Default-Start: 2 3 4 5
|
|
# Default-Stop: 0 1 6
|
|
# Short-Description: Open vSwitch switch
|
|
# Description: openvswitch-switch provides the userspace components and utilities for
|
|
# the Open vSwitch kernel-based switch.
|
|
### END INIT INFO
|
|
|
|
(test -x /usr/sbin/ovs-vswitchd && test -x /usr/sbin/ovsdb-server) || exit 0
|
|
|
|
. /usr/share/openvswitch/scripts/ovs-lib
|
|
test -e /etc/default/openvswitch-switch && . /etc/default/openvswitch-switch
|
|
|
|
network_interfaces () {
|
|
INTERFACES="/etc/network/interfaces"
|
|
[ -e "${INTERFACES}" ] || return
|
|
bridges=`awk '{ if ($1 == "allow-ovs") { print $2; } }' "${INTERFACES}"`
|
|
[ -n "${bridges}" ] && $1 --allow=ovs ${bridges}
|
|
}
|
|
|
|
load_kmod () {
|
|
ovs_ctl load-kmod || exit $?
|
|
}
|
|
|
|
start () {
|
|
if ovs_ctl load-kmod; then
|
|
:
|
|
else
|
|
echo "Module has probably not been built for this kernel."
|
|
if ! test -d /usr/share/doc/openvswitch-datapath-source; then
|
|
echo "Install the openvswitch-datapath-source package, then read"
|
|
else
|
|
echo "For instructions, read"
|
|
fi
|
|
echo "/usr/share/doc/openvswitch-datapath-source/README.Debian"
|
|
|
|
if test X"$OVS_MISSING_KMOD_OK" = Xyes; then
|
|
# We're being invoked by the package postinst. Do not
|
|
# fail package installation just because the kernel module
|
|
# is not available.
|
|
exit 0
|
|
fi
|
|
fi
|
|
set ovs_ctl ${1-start} --system-id=random
|
|
if test X"$FORCE_COREFILES" != X; then
|
|
set "$@" --force-corefiles="$FORCE_COREFILES"
|
|
fi
|
|
set "$@" $OVS_CTL_OPTS
|
|
"$@" || exit $?
|
|
[ "$2" = "start" ] && network_interfaces ifup
|
|
}
|
|
|
|
stop () {
|
|
network_interfaces ifdown
|
|
ovs_ctl stop
|
|
}
|
|
|
|
restart () {
|
|
# 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
|
|
fi
|
|
}
|
|
|
|
case $1 in
|
|
start)
|
|
start
|
|
;;
|
|
stop | force-stop)
|
|
stop
|
|
;;
|
|
reload | force-reload)
|
|
# The OVS daemons keep up-to-date.
|
|
;;
|
|
restart)
|
|
shift
|
|
restart "$@"
|
|
;;
|
|
status)
|
|
ovs_ctl status
|
|
exit $?
|
|
;;
|
|
force-reload-kmod)
|
|
start force-reload-kmod
|
|
;;
|
|
load-kmod)
|
|
load_kmod
|
|
;;
|
|
*)
|
|
echo "Usage: $0 {start|stop|restart|force-reload|status|force-stop|force-reload-kmod|load-kmod}" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
exit 0
|