From: Evan Broder Date: Mon, 10 Nov 2008 08:16:05 +0000 (-0500) Subject: Use a lock LV when starting sysvms since exclusive LV activation has X-Git-Tag: 0.0.13^0 X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-xen-config.git/commitdiff_plain/8f57a1411c5cec075f3e81eb58fe0d2e471bb1f7?hp=70660d7da71a10f52d18c31a08874c3e695710a3 Use a lock LV when starting sysvms since exclusive LV activation has useless semantics svn path=/trunk/packages/invirt-xen-config/; revision=1580 --- diff --git a/debian/changelog b/debian/changelog index af7421c..67ae9e7 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +invirt-xen-config (0.0.13) unstable; urgency=low + + * Use a lock LV when attempting to start sysvms since exclusive LV + activation has useless semantics + + -- Evan Broder Mon, 10 Nov 2008 03:15:31 -0500 + invirt-xen-config (0.0.12) unstable; urgency=low * Add missing close paren to init script diff --git a/debian/invirt-xen-config.init b/debian/invirt-xen-config.init index 430ae9e..d0d8582 100755 --- a/debian/invirt-xen-config.init +++ b/debian/invirt-xen-config.init @@ -26,31 +26,39 @@ start_sysvm() { # somewhere on the cluster VM="$1" - DISK="/dev/xenvg/${VM}_hda" + LV="${VM}_hda" + DISK="/dev/xenvg/$LV" # Don't bother trying to start the VM if it's already running - if xm list "$1" >/dev/null 2>&1; then + if xm list "$VM" >/dev/null 2>&1; then return 1 fi - if lvchange -a n "$DISK" >/dev/null 2>&1 && lvchange -a ey "$DISK" >/dev/null 2>&1; then - # If we can disable and then re-enable the VMs disk, then the - # VM can't be running. If the lvchange -a ey succeeds, then we - # have an exclusive lock across the cluster on enabling the - # disk, which avoids the potential race condition of two hosts - # starting a VM at the same time - [ "$VERBOSE" != no ] && log_daemon_msg "Starting sysvm $VM" - xm create "sysvms/$VM" >/dev/null - [ "$VERBOSE" != no ] && log_end_msg $? - RET=0 - else - RET=1 - fi + RET=1 + # To keep multiple hosts from trying to start a VM at the same + # time, lock VM creation at startup-time with a lock LV, since LV + # creation is atomic + if lvcreate -L 1K -n "lock_${LV}" xenvg >/dev/null 2>&1; then + # If we can disable the LV, then the VM isn't already running + # somewhere else + if lvchange -a n "$DISK" >/dev/null 2>&1; then + lvchange -a y "$DISK" >/dev/null 2>&1 + + [ "$VERBOSE" != no ] && log_daemon_msg "Starting sysvm $VM" + xm create "sysvms/$VM" >/dev/null + [ "$VERBOSE" != no ] && log_end_msg $? + RET=0 + fi + + # Regardless of whether we could get the lock or not, the + # lvchange -a n probably disabled the LV somewhere; be sure we + # clean up + lvchange -a y "$DISK" >/dev/null 2>&1 - # Regardless of whether we could get the lock or not, the - # lvchange -a n probably disabled the LV somewhere; be sure we - # clean up - lvchange -a y "$DISK" >/dev/null 2>&1 + # Cleanup the lock, regardless of whether we started the LV + lvchange -a n "/dev/xenvg/lock_${LV}" + lvremove -f "/dev/xenvg/lock_${LV}" + fi return $RET }