X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-xen-config.git/blobdiff_plain/12eb632cfa17518f14e7e8090536fef103bc4982..8f57a1411c5cec075f3e81eb58fe0d2e471bb1f7:/debian/invirt-xen-config.init diff --git a/debian/invirt-xen-config.init b/debian/invirt-xen-config.init index 02dedc1..d0d8582 100755 --- a/debian/invirt-xen-config.init +++ b/debian/invirt-xen-config.init @@ -13,13 +13,8 @@ PACKAGE=invirt-xen-config NAME="$PACKAGE" DESC="Invirt Xen host" PARENTPACKAGE=xend -GEN_FILES=(/etc/xen/xend-config.sxp.invirt) SYSVMS=(s_master s_remote s_console) -i=1 -for vm in "${SYSVMS[@]}"; do - GEN_FILES[$i]="/etc/xen/sysvms/$vm" - i=$((i + 1)) -done +GEN_FILES=(/etc/xen/xend-config.sxp.invirt "${SYSVMS[@]/#//etc/xen/sysvms/}") dpkg -s "$PACKAGE" >/dev/null 2>/dev/null || exit 0 @@ -31,27 +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 lock on the VM's disk, then the VM isn't running - [ "$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 }