From 99ded0f8846ed3eb683411bfa37ca603c41197d8 Mon Sep 17 00:00:00 2001 From: kvaps Date: Wed, 17 Apr 2019 14:00:04 +0200 Subject: [PATCH] F #2352 #2359 #2981 #3130 #3233: Fix fs_lvm cleanup and offline migration issues (#3201) Signed-off-by: kvaps --- src/tm_mad/fs_lvm/delete | 105 +++++++++++++++++++++++++-------------- src/tm_mad/fs_lvm/mv | 48 ++++++++++++------ 2 files changed, 99 insertions(+), 54 deletions(-) diff --git a/src/tm_mad/fs_lvm/delete b/src/tm_mad/fs_lvm/delete index afeb1779af..474874f8cb 100755 --- a/src/tm_mad/fs_lvm/delete +++ b/src/tm_mad/fs_lvm/delete @@ -44,64 +44,93 @@ source ${DRIVER_PATH}/../../datastore/libfs.sh DST_PATH=`arg_path $DST` DST_HOST=`arg_host $DST` -DS_SYS_ID=$(echo $DST_PATH | grep -E '\/disk\.[[:digit:]]+$' | $AWK -F '/' '{print $(NF-2)}') +if [ `is_disk $DST_PATH` -eq 1 ]; then + DS_SYS_ID=$(echo $DST_PATH | $AWK -F '/' '{print $(NF-2)}') +else + DS_SYS_ID=$(echo $DST_PATH | $AWK -F '/' '{print $(NF-1)}') +fi + +unset i j XPATH_ELEMENTS +while IFS= read -r -d '' element; do + XPATH_ELEMENTS[i++]="$element" +done < <(onevm show -x $VM_ID | $XPATH \ + '/VM/HISTORY_RECORDS/HISTORY[last()]/HOSTNAME') + +LAST_HOST="${XPATH_ELEMENTS[j++]}" + + +# Change DST_HOST to one of the BRIDGE_LIST to prevent +# running on frontend for undeployed VMs +if [ "$LAST_HOST" != "$DST_HOST" ]; then + unset i j XPATH_ELEMENTS + while IFS= read -r -d '' element; do + XPATH_ELEMENTS[i++]="$element" + done < <(onedatastore show -x $DS_SYS_ID | $XPATH \ + /DATASTORE/TEMPLATE/BRIDGE_LIST) + + BRIDGE_LIST="${XPATH_ELEMENTS[j++]}" + + if [ -n "$BRIDGE_LIST" ]; then + DST_HOST=$(get_destination_host) + fi +fi + +# Activate device +ACTIVATE_CMD=$(cat </dev/null; then + ${SUDO} ${SYNC} + ${SUDO} ${LVSCAN} + ${SUDO} ${LVCHANGE} -ay "\${DEV}" + fi + fi +EOF +) # Zero space ZERO_CMD=$(cat </dev/null; then - ${DD} if=/dev/zero of="\${DEV}" bs=${DD_BLOCK_SIZE:-64k} || : + set -ex -o pipefail + if [ -L "$DST_PATH" ]; then + DEV=\$(readlink $DST_PATH) + if echo "\$DEV" | grep "^/dev/" &>/dev/null; then + ${DD} if=/dev/zero of="\${DEV}" bs=${DD_BLOCK_SIZE:-64k} || : + fi fi EOF ) # Delete the device if it's a clone (LVM snapshot) DELETE_CMD=$(cat </dev/null; then - $SUDO $LVREMOVE -f \$DEV + $SUDO $LVREMOVE -f "\$DEV" fi fi + + rm -f "$DST_PATH" EOF ) -if [ -n "${DS_SYS_ID}" ]; then - - while IFS= read -r -d '' element; do - XPATH_ELEMENTS[i++]="$element" - done < <(onedatastore show -x $DS_SYS_ID | $XPATH \ - /DATASTORE/TEMPLATE/BRIDGE_LIST) - unset i - BRIDGE_LIST="${XPATH_ELEMENTS[i++]}" - - # Change DST_HOST to one of the BRIDGE_LIST to prevent - # running on frontend for undeployed VMs - if [ -n "$BRIDGE_LIST" ]; then - DST_HOST=$(get_destination_host) - fi - - if [ "${ZERO_LVM_ON_DELETE}" = "yes" ]; then - ssh_exec_and_log "$DST_HOST" "$ZERO_CMD" "Error cleaning $DST_PATH" - fi - +if [ "${ZERO_LVM_ON_DELETE}" = "yes" ]; then LOCK="tm-fs_lvm-${DS_SYS_ID}.lock" - exclusive "${LOCK}" 120 ssh_exec_and_log "$DST_HOST" "$DELETE_CMD" \ - "Error deleting $DST_PATH" -else - ssh_exec_and_log "$DST_HOST" "$DELETE_CMD" "Error deleting $DST_PATH" + exclusive "${LOCK}" 120 ssh_exec_and_log "$DST_HOST" "$ACTIVATE_CMD" \ + "Error activating disk $SRC_PATH" + + ssh_exec_and_log "$DST_HOST" "$ZERO_CMD" "Error cleaning $DST_PATH" fi +LOCK="tm-fs_lvm-${DS_SYS_ID}.lock" +exclusive "${LOCK}" 120 ssh_exec_and_log "$DST_HOST" "$DELETE_CMD" \ + "Error deleting $DST_PATH" + hup_collectd $DST_HOST diff --git a/src/tm_mad/fs_lvm/mv b/src/tm_mad/fs_lvm/mv index a97ef30245..db49022b45 100755 --- a/src/tm_mad/fs_lvm/mv +++ b/src/tm_mad/fs_lvm/mv @@ -56,21 +56,19 @@ DST_PATH=`arg_path $DST` SRC_HOST=`arg_host $SRC` DST_HOST=`arg_host $DST` +SRC_DIR=`dirname $SRC_PATH` DST_DIR=`dirname $DST_PATH` -SRC_DS_DIR=`dirname $SRC_PATH` -SRC_VM_DIR=`basename $SRC_PATH` - -SRC_DS_SYS_ID=$(echo $SRC_DS_DIR | $AWK -F '/' '{print $(NF-1)}') -DST_DS_SYS_ID=$(echo $DST_DIR | $AWK -F '/' '{print $(NF-1)}') - # Activate the disk in the target host -if [ `is_disk $DST_PATH` -eq 1 ]; then +if [ `is_disk $SRC_PATH` -eq 1 ]; then #--------------------------------------------------------------------------- # Get Image information #--------------------------------------------------------------------------- - DISK_ID=${SRC_VM_DIR##*.} + SRC_DS_SYS_ID=$(echo $SRC_DIR | $AWK -F '/' '{print $(NF-1)}') + DST_DS_SYS_ID=$(echo $DST_DIR | $AWK -F '/' '{print $(NF-1)}') + + DISK_ID=${SRC_PATH##*.} XPATH="${DRIVER_PATH}/../../datastore/xpath.rb --stdin" @@ -79,15 +77,9 @@ if [ `is_disk $DST_PATH` -eq 1 ]; then while IFS= read -r -d '' element; do XPATH_ELEMENTS[i++]="$element" done < <(onevm show -x $VMID | $XPATH \ - /VM/TEMPLATE/DISK[DISK_ID=$DISK_ID]/TYPE ) + /VM/LCM_STATE ) - TYPE="${XPATH_ELEMENTS[j++]}" - - #### - - if [ "${TYPE}" != "BLOCK" ]; then - exit 0 - fi + LCM_STATE="${XPATH_ELEMENTS[j++]}" LV_NAME="lv-one-${VMID}-${DISK_ID}" SRC_VG_NAME="vg-one-${SRC_DS_SYS_ID}" @@ -95,6 +87,30 @@ if [ `is_disk $DST_PATH` -eq 1 ]; then DST_VG_NAME="vg-one-${DST_DS_SYS_ID}" DST_DEV="/dev/${DST_VG_NAME}/${LV_NAME}" + # for prolog operation skip deactivate + if ! [[ "$LCM_STATE" =~ ^(31|50)$ ]]; then + # deactivate + CMD=$(cat <