Re: [libvirt] [PATCH v2] libvirt-guests: Add parallel startup and shutdown of guests
On 03/03/2012 03:03 AM, Eric Blake wrote: On 03/01/2012 07:23 AM, Peter Krempa wrote: With this patch, it's possible to shut down guests in parallel. Parallel startup was possible before, but this functionality was not documented properly. To enable parallel startup set the START_DELAY to 0. Parallel shutdown has a configurable parameter PARALLEL_SHUTDOWN that defines the number of machines being shut down in parallel. Enabling this feature changes the semantics of SHUTDOWN_TIMEOUT parameter that is applied as a cumulative timeout to shutdown all guests on a URI. --- +# shutdown_guests_parallel URI GUESTS +# Shutdown guests GUESTS on machine URI in parallel +shutdown_guests_parallel() +{ +uri=$1 +guests=$2 + +on_shutdown= check_timeout=false +timeout=$SHUTDOWN_TIMEOUT if [ $timeout -gt 0 ]; then check_timeout=true fi +while [ -n $on_shutdown ] || [ -n $guests ]; do +while [ -n $guests ] + [ $(guest_count $on_shutdown) -lt $PARALLEL_SHUTDOWN ]; do +set -- $guests +guest=$1 +shift +guests=$* +shutdown_guest_async $uri $guest +on_shutdown=$on_shutdown $guest +done +sleep 1 if $check_timeout; then +timeout=$(($timeout - 1)) +if [ $timeout -le 0 ]; then +eval_gettext Timeout expired while shutting down domains; echo +RETVAL=1 +return +fi fi +on_shutdown_prev=$on_shutdown +on_shutdown=$(check_guests_shutdown $uri $on_shutdown) +print_guests_shutdown $uri $on_shutdown_prev $on_shutdown +done +} + -# number of seconds we're willing to wait for a guest to shut down +# If set to non-zero, shutdown will suspend guests concurrently. Number of +# guests on shutdown at any time will not exceed number set in this variable. +#PARALLEL_SHUTDOWN=0 + +# Number of seconds we're willing to wait for a guest to shut down. If parallel +# shutdown is enabled, this timeout applies as a timeout for shutting down all +# guests on a single URI defined in the variable URIS. This must be set to +# a nonzero positive value if the shutdown action is requested. Change the last sentence: If this is 0, then there is no time out (use with caution, as guests might not respond to a shutdown request). (Hmm, maybe we want to default to 300 [5 minutes], and document our non-zero default, so that you have to explicitly request 0 to avoid timeouts.) ACK with those lines added to shutdown_guests_parallel, and the wording change to the config file, and with the optional change to the timeout default. The same check for the timeout was also needed in shutdown_guest(). I added the checks, changed the wording in the config file and set the default SHUTDOWN_TIMEOUT to 300 (with a note in the docs) and pushed the result. Thanks Peter -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2] libvirt-guests: Add parallel startup and shutdown of guests
On 03/01/2012 07:23 AM, Peter Krempa wrote: With this patch, it's possible to shut down guests in parallel. Parallel startup was possible before, but this functionality was not documented properly. To enable parallel startup set the START_DELAY to 0. Parallel shutdown has a configurable parameter PARALLEL_SHUTDOWN that defines the number of machines being shut down in parallel. Enabling this feature changes the semantics of SHUTDOWN_TIMEOUT parameter that is applied as a cumulative timeout to shutdown all guests on a URI. --- +# shutdown_guests_parallel URI GUESTS +# Shutdown guests GUESTS on machine URI in parallel +shutdown_guests_parallel() +{ +uri=$1 +guests=$2 + +on_shutdown= check_timeout=false +timeout=$SHUTDOWN_TIMEOUT if [ $timeout -gt 0 ]; then check_timeout=true fi +while [ -n $on_shutdown ] || [ -n $guests ]; do +while [ -n $guests ] + [ $(guest_count $on_shutdown) -lt $PARALLEL_SHUTDOWN ]; do +set -- $guests +guest=$1 +shift +guests=$* +shutdown_guest_async $uri $guest +on_shutdown=$on_shutdown $guest +done +sleep 1 if $check_timeout; then +timeout=$(($timeout - 1)) +if [ $timeout -le 0 ]; then +eval_gettext Timeout expired while shutting down domains; echo +RETVAL=1 +return +fi fi +on_shutdown_prev=$on_shutdown +on_shutdown=$(check_guests_shutdown $uri $on_shutdown) +print_guests_shutdown $uri $on_shutdown_prev $on_shutdown +done +} + -# number of seconds we're willing to wait for a guest to shut down +# If set to non-zero, shutdown will suspend guests concurrently. Number of +# guests on shutdown at any time will not exceed number set in this variable. +#PARALLEL_SHUTDOWN=0 + +# Number of seconds we're willing to wait for a guest to shut down. If parallel +# shutdown is enabled, this timeout applies as a timeout for shutting down all +# guests on a single URI defined in the variable URIS. This must be set to +# a nonzero positive value if the shutdown action is requested. Change the last sentence: If this is 0, then there is no time out (use with caution, as guests might not respond to a shutdown request). (Hmm, maybe we want to default to 300 [5 minutes], and document our non-zero default, so that you have to explicitly request 0 to avoid timeouts.) ACK with those lines added to shutdown_guests_parallel, and the wording change to the config file, and with the optional change to the timeout default. -- Eric Blake ebl...@redhat.com+1-919-301-3266 Libvirt virtualization library http://libvirt.org signature.asc Description: OpenPGP digital signature -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2] libvirt-guests: Add parallel startup and shutdown of guests
With this patch, it's possible to shut down guests in parallel. Parallel startup was possible before, but this functionality was not documented properly. To enable parallel startup set the START_DELAY to 0. Parallel shutdown has a configurable parameter PARALLEL_SHUTDOWN that defines the number of machines being shut down in parallel. Enabling this feature changes the semantics of SHUTDOWN_TIMEOUT parameter that is applied as a cumulative timeout to shutdown all guests on a URI. --- Diff to v1: -changed domains to guests -used efficient code to avoid subshells -remove unused helper functions -added error message when loosing track of guest in case of error -added docs that setting of SHUTDOWN_TIMEOUT is needed with shutdown action -added initialisation of PARALLEL_SHUTDOWN -fixed output redirections -fixed typo in sysconfig file tools/libvirt-guests.init.sh | 116 +++--- tools/libvirt-guests.sysconf | 12 - 2 files changed, 119 insertions(+), 9 deletions(-) diff --git a/tools/libvirt-guests.init.sh b/tools/libvirt-guests.init.sh index c867ece..141d7fa 100644 --- a/tools/libvirt-guests.init.sh +++ b/tools/libvirt-guests.init.sh @@ -42,6 +42,7 @@ URIS=default ON_BOOT=start ON_SHUTDOWN=suspend SHUTDOWN_TIMEOUT=0 +PARALLEL_SHUTDOWN=0 START_DELAY=0 BYPASS_CACHE=0 @@ -273,6 +274,102 @@ shutdown_guest() fi } +# shutdown_guest_async URI GUEST +# Start a ACPI shutdown of GUEST on URI. This function returns after the command +# was issued to libvirt to allow parallel shutdown. +shutdown_guest_async() +{ +uri=$1 +guest=$2 + +name=$(guest_name $uri $guest) +eval_gettext Starting shutdown on guest: \$name +echo +retval run_virsh $uri shutdown $guest /dev/null +} + +# guest_count GUEST_LIST +# Returns number of guests in GUEST_LIST +guest_count() +{ +set -- $1 +echo $# +} + +# check_guests_shutdown URI GUESTS +# check if shutdown is complete on guests in GUESTS and returns only +# guests that are still shutting down +check_guests_shutdown() +{ +uri=$1 +guests=$2 + +guests_up= +for guest in $guests; do +if ! guest_is_on $uri $guest /dev/null 21; then +eval_gettext Failed to determine state of guest: \$guest. Not tracking it anymore. +echo +continue +fi +if $guest_running; then +guests_up=$guests_up $guest +fi +done +echo $guests_up +} + +# print_guests_shutdown URI BEFORE AFTER +# Checks for differences in the lists BEFORE and AFTER and prints +# a shutdown complete notice for guests that have finished +print_guests_shutdown() +{ +uri=$1 +before=$2 +after=$3 + +for guest in $before; do +case $after in +* $guest *) continue;; +esac + +name=$(guest_name $uri $guest) +eval_gettext Shutdown of guest \$name complete. +echo +done +} + +# shutdown_guests_parallel URI GUESTS +# Shutdown guests GUESTS on machine URI in parallel +shutdown_guests_parallel() +{ +uri=$1 +guests=$2 + +on_shutdown= +timeout=$SHUTDOWN_TIMEOUT +while [ -n $on_shutdown ] || [ -n $guests ]; do +while [ -n $guests ] + [ $(guest_count $on_shutdown) -lt $PARALLEL_SHUTDOWN ]; do +set -- $guests +guest=$1 +shift +guests=$* +shutdown_guest_async $uri $guest +on_shutdown=$on_shutdown $guest +done +sleep 1 +timeout=$(($timeout - 1)) +if [ $timeout -le 0 ]; then +eval_gettext Timeout expired while shutting down domains; echo +RETVAL=1 +return +fi +on_shutdown_prev=$on_shutdown +on_shutdown=$(check_guests_shutdown $uri $on_shutdown) +print_guests_shutdown $uri $on_shutdown_prev $on_shutdown +done +} + # stop # Shutdown or save guests on the configured uris stop() { @@ -359,13 +456,18 @@ stop() { eval_gettext Shutting down guests on \$uri URI...; echo fi -for guest in $list; do -if $suspending; then -suspend_guest $uri $guest -else -shutdown_guest $uri $guest -fi -done +if [ $PARALLEL_SHUTDOWN -gt 1 ] + ! $suspending; then +shutdown_guests_parallel $uri $list +else +for guest in $list; do +if $suspending; then +suspend_guest $uri $guest +else +shutdown_guest $uri $guest +fi +done +fi done $LISTFILE rm -f $VAR_SUBSYS_LIBVIRT_GUESTS diff --git a/tools/libvirt-guests.sysconf b/tools/libvirt-guests.sysconf index 9b8b64f..3e0db46 100644 --- a/tools/libvirt-guests.sysconf +++ b/tools/libvirt-guests.sysconf @@ -10,7 +10,8 @@ # libvirtd #ON_BOOT=start -# number of seconds to wait between each guest start