X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-xen-config.git/blobdiff_plain/70660d7da71a10f52d18c31a08874c3e695710a3..a6fc4d186a63ed3c372d217a878f5e1d7aca8734:/debian/invirt-xen-config.init diff --git a/debian/invirt-xen-config.init b/debian/invirt-xen-config.init index 430ae9e..567d7d2 100755 --- a/debian/invirt-xen-config.init +++ b/debian/invirt-xen-config.init @@ -13,8 +13,10 @@ PACKAGE=invirt-xen-config NAME="$PACKAGE" DESC="Invirt Xen host" PARENTPACKAGE=xend -SYSVMS=(s_master s_remote s_console) -GEN_FILES=(/etc/xen/xend-config.sxp.invirt "${SYSVMS[@]/#//etc/xen/sysvms/}") +SYSVM_TEMPLATES=(/etc/xen/sysvms/s_*.mako) +SYSVM_FILES=("${SYSVM_TEMPLATES[@]/.mako/}") +SYSVMS=("${SYSVM_FILES[@]/#\/etc\/xen\/sysvms\/}") +GEN_FILES=(/etc/xen/xend-config.sxp.invirt "${SYSVM_FILES[@]}") dpkg -s "$PACKAGE" >/dev/null 2>/dev/null || exit 0 @@ -26,31 +28,40 @@ 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}" >/dev/null 2>&1 + lvchange -a ey "/dev/xenvg/lock_${LV}" >/dev/null 2>&1 + lvremove -f "/dev/xenvg/lock_${LV}" >/dev/null 2>&1 + fi return $RET }