X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=utilities%2Fovs-ctl.in;h=0735160ae33fbb6a04f4d00b263bf0b05b55f520;hb=0ef165ecb57943e17a8ee8270df68ffb8d032e29;hp=dd958a2dc96ecc7314a61742115d2512d96916e9;hpb=737af96ddee6bed45e3f035c3f043a67bef2f295;p=sliver-openvswitch.git diff --git a/utilities/ovs-ctl.in b/utilities/ovs-ctl.in index dd958a2dc..0735160ae 100755 --- a/utilities/ovs-ctl.in +++ b/utilities/ovs-ctl.in @@ -30,7 +30,7 @@ done ## start ## ## ----- ## -insert_openvswitch_mod_if_required () { +insert_mod_if_required () { # If openvswitch is already loaded then we're done. test -e /sys/module/openvswitch -o -e /sys/module/openvswitch_mod && \ return 0 @@ -52,12 +52,8 @@ insert_openvswitch_mod_if_required () { action "Inserting openvswitch module" modprobe openvswitch } -insert_mod_if_required () { - insert_openvswitch_mod_if_required || return 1 -} - ovs_vsctl () { - ovs-vsctl --no-wait --timeout=5 "$@" + ovs-vsctl --no-wait "$@" } ovsdb_tool () { @@ -157,7 +153,7 @@ set_system_ids () { check_force_cores () { if test X"$FORCE_COREFILES" = Xyes; then - ulimit -Sc 67108864 + ulimit -c 67108864 fi } @@ -188,7 +184,6 @@ start_ovsdb () { done set "$@" -vconsole:emer -vsyslog:err -vfile:info set "$@" --remote=punix:"$DB_SOCK" - set "$@" --remote=db:Open_vSwitch,Open_vSwitch,manager_options set "$@" --private-key=db:Open_vSwitch,SSL,private_key set "$@" --certificate=db:Open_vSwitch,SSL,certificate set "$@" --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert @@ -207,6 +202,19 @@ start_ovsdb () { fi } +add_managers () { + # Now that ovs-vswitchd has started and completed its initial + # configuration, tell ovsdb-server to conenct to the remote managers. We + # used to do this at ovsdb-server startup time, but waiting for + # ovs-vswitchd to finish configuring means that remote managers see less + # churn in the database at startup or restart. (For example, managers + # won't briefly see empty datapath-id or ofport columns for records that + # exist at startup.) + action "Enabling remote OVSDB managers" \ + ovs-appctl -t ovsdb-server ovsdb-server/add-remote \ + db:Open_vSwitch,Open_vSwitch,manager_options +} + start_forwarding () { check_force_cores @@ -216,10 +224,10 @@ 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 one file descriptor per bridge port, so this + # allows a very large number of bridges and ports. + ulimit -n 7500 # Start ovs-vswitchd. set ovs-vswitchd unix:"$DB_SOCK" @@ -285,8 +293,6 @@ save_ofports_if_required () { action "Saving ofport values" ovs_save save-ofports \ "${script_ofports}" ;; - *) - ;; esac } @@ -300,6 +306,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}" @@ -315,7 +330,7 @@ restore_interfaces () { level=err fi log="logger -p daemon.$level -t ovs-save" - $log "force-reload-kmod interface restore script exited with status $rc:" + $log "interface restore script exited with status $rc:" $log -f "$script_interfaces" } @@ -351,6 +366,7 @@ force_reload_kmod () { else log_warning_msg "Failed to save configuration, not replacing kernel module" start_forwarding + add_managers exit 1 fi chmod +x "$script_interfaces" @@ -366,9 +382,14 @@ 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 @@ -379,13 +400,25 @@ force_reload_kmod () { ## restart ## ## ------- ## +save_interfaces_if_required () { + # Save interfaces if we are upgrading from a pre-1.10 branch. + case `ovs-appctl version | sed 1q` in + "ovs-vswitchd (Open vSwitch) 1."[0-9].*) + ifaces=`internal_interfaces` + action "Detected internal interfaces: $ifaces" true + if action "Saving interface configuration" save_interfaces; then + chmod +x "$script_interfaces" + fi + ;; + esac +} + restart () { if daemon_is_running ovsdb-server && daemon_is_running ovs-vswitchd; then - script_flows=`mktemp` - trap 'rm -f "${script_flows}"' 0 - - action "Saving flows" ovs_save save-flows "${script_flows}" \ - script_flows + init_restore_scripts + save_interfaces_if_required + action "Saving flows" ovs_save save-flows "${script_flows}" + save_ofports_if_required fi # Restart the database first, since a large database may take a @@ -393,11 +426,23 @@ restart () { stop_ovsdb start_ovsdb + # Restore of ofports, if required, should happen before vswitchd is + # restarted. + 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. Do not return error if restore fails. - restore_flows || true + # 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. + restore_interfaces || true } ## --------------- ## @@ -641,6 +686,7 @@ case $command in start) start_ovsdb start_forwarding + add_managers ;; stop) stop_forwarding