bug 10363 : cleanup vhd in primary storage if download template to primary storage fails

Conflicts:

	core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
	scripts/vm/hypervisor/xenserver/vmops
This commit is contained in:
anthony 2012-01-10 13:56:20 -08:00
parent c25cb29f10
commit f964c4d227
8 changed files with 128 additions and 49 deletions

View File

@ -2271,24 +2271,59 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
throw new CloudRuntimeException(results);
}
}
boolean killCopyProcess(Connection conn, String nameLabel) {
String results = callHostPluginAsync(conn, "vmops", "kill_copy_process",
60, "namelabel", nameLabel);
String errMsg = null;
if (results == null || results.equals("false")) {
errMsg = "kill_copy_process failed";
s_logger.warn(errMsg);
return false;
} else {
return true;
}
}
void destroyVDIbyNameLabel(Connection conn, String nameLabel) {
try {
Set<VDI> vdis = VDI.getByNameLabel(conn, nameLabel);
if ( vdis.size() != 1 ) {
s_logger.warn("destoryVDIbyNameLabel failed due to there are " + vdis.size() + " VDIs with name " + nameLabel);
return;
}
for (VDI vdi : vdis) {
try {
vdi.destroy(conn);
} catch (Exception e) {
}
}
} catch (Exception e){
}
}
String copy_vhd_from_secondarystorage(Connection conn, String mountpoint, String sruuid, int wait) {
String nameLabel = "cloud-" + UUID.randomUUID().toString();
String results = callHostPluginAsync(conn, "vmopspremium", "copy_vhd_from_secondarystorage",
wait, "mountpoint", mountpoint, "sruuid", sruuid);
wait, "mountpoint", mountpoint, "sruuid", sruuid, "namelabel", nameLabel);
String errMsg = null;
if (results == null || results.isEmpty()) {
String msg = "copy_vhd_from_secondarystorage return null";
s_logger.warn(msg);
throw new CloudRuntimeException(msg);
}
String[] tmp = results.split("#");
String status = tmp[0];
if (status.equals("0")) {
return tmp[1];
errMsg = "copy_vhd_from_secondarystorage return null";
} else {
s_logger.warn(tmp[1]);
throw new CloudRuntimeException(tmp[1]);
String[] tmp = results.split("#");
String status = tmp[0];
if (status.equals("0")) {
return tmp[1];
} else {
errMsg = tmp[1];
}
}
String source = mountpoint.substring(mountpoint.lastIndexOf('/') + 1);
if( killCopyProcess(conn, source) ) {
destroyVDIbyNameLabel(conn, nameLabel);
}
s_logger.warn(errMsg);
throw new CloudRuntimeException(errMsg);
}
public PrimaryStorageDownloadAnswer execute(final PrimaryStorageDownloadCommand cmd) {
@ -3102,6 +3137,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
} finally {
if (task != null) {
try {
task.cancel(conn);
task.destroy(conn);
} catch (Exception e1) {
s_logger.warn("unable to destroy task(" + task.toString() + ") on host(" + _host.uuid + ") due to ", e1);

View File

@ -4,7 +4,7 @@
#set -x
usage() {
printf "Usage: %s [vhd file in secondary storage] [uuid of the source sr] \n" $(basename $0)
printf "Usage: %s [vhd file in secondary storage] [uuid of the source sr] [name label] \n" $(basename $0)
}
cleanup()
@ -40,6 +40,14 @@ if [ $? -ne 0 ]; then
exit 0
fi
if [ -z $3 ]; then
usage
echo "3#no namelabel"
exit 0
else
namelabel=$3
fi
localmp=/var/run/cloud_mount/$(uuidgen -r)
mkdir -p $localmp
@ -107,31 +115,20 @@ copyvhd()
fi
}
size=$($VHDUTIL query -v -n $vhdfile)
uuid=$(xe vdi-create sr-uuid=$sruuid virtual-size=${size}MiB type=user name-label=$namelabel)
if [ $? -ne 0 ]; then
echo "9#can not create vdi in sr $sruuid"
cleanup
exit 0
fi
if [ $type == "nfs" -o $type == "ext" ]; then
uuid=$(uuidgen -r)
desvhd=/var/run/sr-mount/$sruuid/$uuid
desvhd=/var/run/sr-mount/$sruuid/$uuid.vhd
copyvhd $desvhd $vhdfile 0 $type
$VHDUTIL set -n $desvhd -f "hidden" -v "0" > /dev/null
if [ $? -ne 0 ]; then
echo "21#failed to set hidden to 0 $desvhd"
cleanup
exit 0
fi
mv /var/run/sr-mount/$sruuid/$uuid /var/run/sr-mount/$sruuid/${uuid}.vhd
xe sr-scan uuid=$sruuid
if [ $? -ne 0 ]; then
echo "14#failed to scan sr $sruuid"
cleanup
exit 0
fi
elif [ $type == "lvmoiscsi" -o $type == "lvm" -o $type == "lvmohba" ]; then
size=$($VHDUTIL query -v -n $vhdfile)
uuid=$(xe vdi-create sr-uuid=$sruuid virtual-size=${size}MiB type=user name-label="cloud")
if [ $? -ne 0 ]; then
echo "9#can not create vdi in sr $sruuid"
cleanup
exit 0
fi
lvsize=$(xe vdi-param-get uuid=$uuid param-name=physical-utilisation)
if [ $? -ne 0 ]; then
echo "12#failed to get physical size of vdi $uuid"
@ -146,24 +143,25 @@ elif [ $type == "lvmoiscsi" -o $type == "lvm" -o $type == "lvmohba" ]; then
exit 0
fi
copyvhd $desvhd $vhdfile $lvsize $type
$VHDUTIL set -n $desvhd -f "hidden" -v "0" > /dev/null
if [ $? -ne 0 ]; then
echo "22#failed to set hidden to 0 $desvhd"
cleanup
exit 0
fi
xe sr-scan uuid=$sruuid
if [ $? -ne 0 ]; then
echo "14#failed to scan sr $sruuid"
cleanup
exit 0
fi
else
echo "15#doesn't support sr type $type"
cleanup
exit 0
fi
$VHDUTIL set -n $desvhd -f "hidden" -v "0" > /dev/null
if [ $? -ne 0 ]; then
echo "21#failed to set hidden to 0 $desvhd"
cleanup
exit 0
fi
xe sr-scan uuid=$sruuid
if [ $? -ne 0 ]; then
echo "14#failed to scan sr $sruuid"
cleanup
exit 0
fi
echo "0#$uuid"
cleanup
exit 0

View File

@ -0,0 +1,30 @@
#!/bin/bash
# Version @VERSION@
#set -x
usage() {
printf "Usage: %s [name label] \n" $(basename $0)
}
if [ -z $1 ]; then
usage
echo "3#no namelabel"
exit 0
else
namelabel=$1
fi
pid=`ps -ef | grep "dd" | grep $namelabel | grep -v "grep" | awk '{print $2}'`
if [ -z $pid ]; then
echo "true"
exit 0
fi
kill -9 $pid
if [ $? -ne 0 ]; then
echo "false"
exit 0
fi
echo "true"
exit 0

View File

@ -124,6 +124,16 @@ def pingdomr(session, args):
return txt
@echo
def kill_copy_process(session, args):
namelabel = args['namelabel']
try:
cmd = ["bash", "/opt/xensource/bin/kill_copy_process.sh", namelabel]
txt = util.pread2(cmd)
except:
txt = 'false'
return txt
@echo
def pingxenserver(session, args):
txt = 'success'
@ -1428,4 +1438,5 @@ if __name__ == "__main__":
"get_rule_logs_for_vms":get_rule_logs_for_vms,
"setLinkLocalIP":setLinkLocalIP, "lt2p_vpn":lt2p_vpn,
"cleanup_rules":cleanup_rules, "checkRouter":checkRouter,
"bumpUpPriority":bumpUpPriority, "getDomRVersion":getDomRVersion })
"bumpUpPriority":bumpUpPriority, "getDomRVersion":getDomRVersion,
"kill_copy_process":kill_copy_process})

View File

@ -67,8 +67,9 @@ def copy_vhd_to_secondarystorage(session, args):
def copy_vhd_from_secondarystorage(session, args):
mountpoint = args['mountpoint']
sruuid = args['sruuid']
namelabel = args['namelabel']
try:
cmd = ["bash", "/opt/xensource/bin/copy_vhd_from_secondarystorage.sh", mountpoint, sruuid]
cmd = ["bash", "/opt/xensource/bin/copy_vhd_from_secondarystorage.sh", mountpoint, sruuid, namelabel]
txt = util.pread2(cmd)
except:
txt = '10#failed'

View File

@ -31,6 +31,7 @@ call_loadbalancer.sh=../../../../network/domr/,0755,/opt/xensource/bin
l2tp_vpn.sh=../../../../network/domr/,0755,/opt/xensource/bin
copy_vhd_to_secondarystorage.sh=..,0755,/opt/xensource/bin
copy_vhd_from_secondarystorage.sh=..,0755,/opt/xensource/bin
kill_copy_process.sh=..,0755,/opt/xensource/bin
setup_heartbeat_sr.sh=..,0755,/opt/xensource/bin
setup_heartbeat_file.sh=..,0755,/opt/xensource/bin
check_heartbeat.sh=..,0755,/opt/xensource/bin

View File

@ -33,6 +33,7 @@ l2tp_vpn.sh=../../../../network/domr/,0755,/opt/xensource/bin
cloud-setup-bonding.sh=..,0755,/opt/xensource/bin
copy_vhd_to_secondarystorage.sh=..,0755,/opt/xensource/bin
copy_vhd_from_secondarystorage.sh=..,0755,/opt/xensource/bin
kill_copy_process.sh=..,0755,/opt/xensource/bin
setup_heartbeat_sr.sh=..,0755,/opt/xensource/bin
setup_heartbeat_file.sh=..,0755,/opt/xensource/bin
check_heartbeat.sh=..,0755,/opt/xensource/bin

View File

@ -33,6 +33,7 @@ l2tp_vpn.sh=../../../../network/domr/,0755,/opt/xensource/bin
cloud-setup-bonding.sh=..,0755,/opt/xensource/bin
copy_vhd_to_secondarystorage.sh=..,0755,/opt/xensource/bin
copy_vhd_from_secondarystorage.sh=..,0755,/opt/xensource/bin
kill_copy_process.sh=..,0755,/opt/xensource/bin
setup_heartbeat_sr.sh=..,0755,/opt/xensource/bin
setup_heartbeat_file.sh=..,0755,/opt/xensource/bin
check_heartbeat.sh=..,0755,/opt/xensource/bin