# HG changeset patch
# User Florian Haas <[email protected]>
# Date 1249915342 -7200
# Node ID 7c7b63f9961d10222b0199450875da88205c2b16
# Parent ed7c50f07c92f30484008f6d8a7ccbd24261b06b
Medium: RA: VirtualDomain: destroy domain shortly before timeout expiry
As lmb pointed out in private email, the VirtualDomain RA is not
as persistent on stop as it should be. This patch employs the
following logic:
- If force_stop is unset and a stop operation is issued, invoke "virsh
shutdown" and loop on monitor for (x-5) seconds, where x is the
operation timeout passed received from the CRM. If the domain is
still alive by then, kill it with "virsh destroy".
- If force_stop is set and a stop operation is issued, invoke "virsh
destroy" outright.
diff -r ed7c50f07c92 -r 7c7b63f9961d heartbeat/VirtualDomain
--- a/heartbeat/VirtualDomain Mon Aug 10 15:45:33 2009 +0200
+++ b/heartbeat/VirtualDomain Mon Aug 10 16:42:22 2009 +0200
@@ -181,19 +181,36 @@
}
VirtualDomain_Stop() {
+ local i
+ local shutdown_timeout
if VirtualDomain_Status ${DOMAIN_NAME}; then
case $OCF_RESKEY_force_stop in
[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
- op="destroy"
;;
*)
- op="shutdown"
+ # Issue a graceful shutdown request
+ ocf_log info "Issuing graceful shutdown request for domain
${DOMAIN_NAME}."
+ virsh $VIRSH_OPTIONS shutdown ${DOMAIN_NAME}
+ # The "shutdown_timeout" we use here is the operation
+ # timeout specified in the CIB, minus 5 seconds
+ shutdown_timeout=$((($OCF_RESKEY_CRM_meta_timeout/1000)-5))
+ # Loop on status for $shutdown_timeout seconds
+ for i in `seq $shutdown_timeout`; do
+ VirtualDomain_Status || break
+ sleep 1
+ done
;;
esac
- virsh $VIRSH_OPTIONS $op ${DOMAIN_NAME}
- while VirtualDomain_Status; do
- sleep 1
- done
+ # OK. Now if the above graceful shutdown hasn't worked, kill
+ # off the domain with destroy. If that too does not work, give
+ # up and have the LRM time us out.
+ if VirtualDomain_Status; then
+ ocf_log info "Issuing forced shutdown (destroy) request for domain
${DOMAIN_NAME}."
+ virsh $VIRSH_OPTIONS destroy ${DOMAIN_NAME}
+ while VirtualDomain_Status; do
+ sleep 1
+ done
+ fi
return $OCF_SUCCESS
else
ocf_log info "Domain $DOMAIN_NAME already stopped."
_______________________________________________________
Linux-HA-Dev: [email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/