X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=utilities%2Fovs-ctl.in;h=bca8c5623ff4934f7f2575bb1b0afc1262030182;hb=54b21db7235d51b75a45a477d57daa06cb9ffe55;hp=fb33f72af81c67932ad0755a0c2e3a4f3e580f20;hpb=1259a0c421cc3c10f0118bbbf4f67286fbb1ae4e;p=cascardo%2Fovs.git diff --git a/utilities/ovs-ctl.in b/utilities/ovs-ctl.in index fb33f72af..bca8c5623 100755 --- a/utilities/ovs-ctl.in +++ b/utilities/ovs-ctl.in @@ -1,5 +1,5 @@ #! /bin/sh -# Copyright (C) 2009, 2010, 2011, 2012, 2013 Nicira, Inc. +# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -30,13 +30,33 @@ done ## start ## ## ----- ## +# Keep track of removed vports so we can reload them if needed +removed_vports="" + +insert_mods () { + # Try loading openvswitch again. + action "Inserting openvswitch module" modprobe openvswitch + + for vport in $removed_vports; do + # Don't treat failures to load vports as fatal error + action "Inserting $vport module" modprobe $vport || true + done +} + insert_mod_if_required () { + # If this kernel has no module support, expect we're done. + if test ! -e /proc/modules + then + log_success_msg "Kernel has no loadable module support. Skipping modprobe" + return 0 + fi + # If openvswitch is already loaded then we're done. test -e /sys/module/openvswitch -o -e /sys/module/openvswitch_mod && \ return 0 # Load openvswitch. If that's successful then we're done. - action "Inserting openvswitch module" modprobe openvswitch && return 0 + insert_mods && return 0 # If the bridge module is loaded, then that might be blocking # openvswitch. Try to unload it, if there are no bridges. @@ -49,7 +69,7 @@ insert_mod_if_required () { action "removing bridge module" rmmod bridge || return 1 # Try loading openvswitch again. - action "Inserting openvswitch module" modprobe openvswitch + insert_mods } ovs_vsctl () { @@ -157,6 +177,12 @@ check_force_cores () { fi } +del_transient_ports () { + for port in `ovs-vsctl --bare -- --columns=name find port other_config:transient=true`; do + ovs_vsctl -- del-port "$port" + done +} + start_ovsdb () { check_force_cores @@ -196,9 +222,12 @@ start_ovsdb () { set_system_ids || return 1 if test X"$DELETE_BRIDGES" = Xyes; then for bridge in `ovs_vsctl list-br`; do - ovs_vsctl del-br $bridge + ovs_vsctl del-br $bridge done fi + if test X"$DELETE_TRANSIENT_PORTS" = Xyes; then + del_transient_ports + fi fi } @@ -224,10 +253,13 @@ start_forwarding () { log_success_msg "ovs-vswitchd is already running" else # Increase the limit on the number of open file descriptors. - # On Linux, ovs-vswitchd needs about one file descriptor per - # switch port, so this allows a very large number of switch - # ports. - ulimit -n 5000 + # On Linux, ovs-vswitchd needs about three file descriptors + # per bridge and "n-handler-threads" file descriptors per bridge + # port, so this allows a very large number of bridges and ports. + MAXFD=65535 + if [ $(ulimit -n) -lt $MAXFD ]; then + ulimit -n $MAXFD + fi # Start ovs-vswitchd. set ovs-vswitchd unix:"$DB_SOCK" @@ -287,7 +319,10 @@ ovs_save () { } save_ofports_if_required () { - # Save ofports if we are upgrading from a pre-1.10 branch. + # Save OpenFlow port numbers if we are upgrading from a pre-1.10 branch. + # + # (Versions 1.10 and later save OpenFlow port numbers without assistance, + # so we don't have to do anything for them. case `ovs-appctl version | sed 1q` in "ovs-vswitchd (Open vSwitch) 1."[0-9].*) action "Saving ofport values" ovs_save save-ofports \ @@ -296,6 +331,12 @@ save_ofports_if_required () { esac } +save_flows_if_required () { + if test X"$DELETE_BRIDGES" != Xyes; then + action "Saving flows" ovs_save save-flows "${script_flows}" + fi +} + save_interfaces () { "$datadir/scripts/ovs-save" save-interfaces ${ifaces} \ > "${script_interfaces}" @@ -306,6 +347,15 @@ restore_ofports () { action "Restoring ofport values" "${script_ofports}" } +flow_restore_wait () { + ovs_vsctl set open_vswitch . other_config:flow-restore-wait="true" +} + +flow_restore_complete () { + ovs_vsctl --if-exists remove open_vswitch . other_config \ + flow-restore-wait="true" +} + restore_flows () { [ -x "${script_flows}" ] && \ action "Restoring saved flows" "${script_flows}" @@ -337,9 +387,7 @@ force_reload_kmod () { action "Detected internal interfaces: $ifaces" true init_restore_scripts - - action "Saving flows" ovs_save save-flows "${script_flows}" - + save_flows_if_required save_ofports_if_required # Restart the database first, since a large database may take a @@ -366,6 +414,13 @@ force_reload_kmod () { action "Removing datapath: $dp" ovs-dpctl del-dp "$dp" done + for vport in `awk '/^vport_/ { print $1 }' /proc/modules`; do + action "Removing $vport module" rmmod $vport + if ! grep -q $vport /proc/modules; then + removed_vports="$removed_vports $vport" + fi + done + # try both old and new names in case this is post upgrade if test -e /sys/module/openvswitch_mod; then action "Removing openvswitch module" rmmod openvswitch_mod @@ -373,9 +428,13 @@ force_reload_kmod () { action "Removing openvswitch module" rmmod openvswitch fi + # Start vswitchd by asking it to wait till flow restore is finished. + flow_restore_wait start_forwarding + # Restore saved flows and inform vswitchd that we are done. restore_flows + flow_restore_complete add_managers restore_interfaces @@ -404,7 +463,7 @@ restart () { if daemon_is_running ovsdb-server && daemon_is_running ovs-vswitchd; then init_restore_scripts save_interfaces_if_required - action "Saving flows" ovs_save save-flows "${script_flows}" + save_flows_if_required save_ofports_if_required fi @@ -418,10 +477,14 @@ restart () { restore_ofports stop_forwarding + + # Start vswitchd by asking it to wait till flow restore is finished. + flow_restore_wait start_forwarding - # Restore the saved flows. + # Restore saved flows and inform vswitchd that we are done. restore_flows + flow_restore_complete add_managers # Restore the interfaces if required. Return true even if restore fails. @@ -482,6 +545,7 @@ set_defaults () { SYSTEM_ID= DELETE_BRIDGES=no + DELETE_TRANSIENT_PORTS=no DAEMON_CWD=/ FORCE_COREFILES=yes @@ -667,7 +731,7 @@ do done case $command in start) - start_ovsdb + start_ovsdb || exit 1 start_forwarding add_managers ;;