mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
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:
parent
c25cb29f10
commit
f964c4d227
@ -2271,24 +2271,59 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||||||
throw new CloudRuntimeException(results);
|
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 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",
|
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()) {
|
if (results == null || results.isEmpty()) {
|
||||||
String msg = "copy_vhd_from_secondarystorage return null";
|
errMsg = "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];
|
|
||||||
} else {
|
} else {
|
||||||
s_logger.warn(tmp[1]);
|
String[] tmp = results.split("#");
|
||||||
throw new CloudRuntimeException(tmp[1]);
|
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) {
|
public PrimaryStorageDownloadAnswer execute(final PrimaryStorageDownloadCommand cmd) {
|
||||||
@ -3102,6 +3137,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
|
|||||||
} finally {
|
} finally {
|
||||||
if (task != null) {
|
if (task != null) {
|
||||||
try {
|
try {
|
||||||
|
task.cancel(conn);
|
||||||
task.destroy(conn);
|
task.destroy(conn);
|
||||||
} catch (Exception e1) {
|
} catch (Exception e1) {
|
||||||
s_logger.warn("unable to destroy task(" + task.toString() + ") on host(" + _host.uuid + ") due to ", e1);
|
s_logger.warn("unable to destroy task(" + task.toString() + ") on host(" + _host.uuid + ") due to ", e1);
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
#set -x
|
#set -x
|
||||||
|
|
||||||
usage() {
|
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()
|
cleanup()
|
||||||
@ -40,6 +40,14 @@ if [ $? -ne 0 ]; then
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ -z $3 ]; then
|
||||||
|
usage
|
||||||
|
echo "3#no namelabel"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
namelabel=$3
|
||||||
|
fi
|
||||||
|
|
||||||
localmp=/var/run/cloud_mount/$(uuidgen -r)
|
localmp=/var/run/cloud_mount/$(uuidgen -r)
|
||||||
|
|
||||||
mkdir -p $localmp
|
mkdir -p $localmp
|
||||||
@ -107,31 +115,20 @@ copyvhd()
|
|||||||
fi
|
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
|
if [ $type == "nfs" -o $type == "ext" ]; then
|
||||||
uuid=$(uuidgen -r)
|
desvhd=/var/run/sr-mount/$sruuid/$uuid.vhd
|
||||||
desvhd=/var/run/sr-mount/$sruuid/$uuid
|
|
||||||
copyvhd $desvhd $vhdfile 0 $type
|
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
|
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)
|
lvsize=$(xe vdi-param-get uuid=$uuid param-name=physical-utilisation)
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
echo "12#failed to get physical size of vdi $uuid"
|
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
|
exit 0
|
||||||
fi
|
fi
|
||||||
copyvhd $desvhd $vhdfile $lvsize $type
|
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
|
else
|
||||||
echo "15#doesn't support sr type $type"
|
echo "15#doesn't support sr type $type"
|
||||||
cleanup
|
cleanup
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
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"
|
echo "0#$uuid"
|
||||||
cleanup
|
cleanup
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
30
scripts/vm/hypervisor/xenserver/kill_copy_process.sh
Executable file
30
scripts/vm/hypervisor/xenserver/kill_copy_process.sh
Executable 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
|
||||||
@ -124,6 +124,16 @@ def pingdomr(session, args):
|
|||||||
|
|
||||||
return txt
|
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
|
@echo
|
||||||
def pingxenserver(session, args):
|
def pingxenserver(session, args):
|
||||||
txt = 'success'
|
txt = 'success'
|
||||||
@ -1428,4 +1438,5 @@ if __name__ == "__main__":
|
|||||||
"get_rule_logs_for_vms":get_rule_logs_for_vms,
|
"get_rule_logs_for_vms":get_rule_logs_for_vms,
|
||||||
"setLinkLocalIP":setLinkLocalIP, "lt2p_vpn":lt2p_vpn,
|
"setLinkLocalIP":setLinkLocalIP, "lt2p_vpn":lt2p_vpn,
|
||||||
"cleanup_rules":cleanup_rules, "checkRouter":checkRouter,
|
"cleanup_rules":cleanup_rules, "checkRouter":checkRouter,
|
||||||
"bumpUpPriority":bumpUpPriority, "getDomRVersion":getDomRVersion })
|
"bumpUpPriority":bumpUpPriority, "getDomRVersion":getDomRVersion,
|
||||||
|
"kill_copy_process":kill_copy_process})
|
||||||
|
|||||||
@ -67,8 +67,9 @@ def copy_vhd_to_secondarystorage(session, args):
|
|||||||
def copy_vhd_from_secondarystorage(session, args):
|
def copy_vhd_from_secondarystorage(session, args):
|
||||||
mountpoint = args['mountpoint']
|
mountpoint = args['mountpoint']
|
||||||
sruuid = args['sruuid']
|
sruuid = args['sruuid']
|
||||||
|
namelabel = args['namelabel']
|
||||||
try:
|
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)
|
txt = util.pread2(cmd)
|
||||||
except:
|
except:
|
||||||
txt = '10#failed'
|
txt = '10#failed'
|
||||||
|
|||||||
@ -31,6 +31,7 @@ call_loadbalancer.sh=../../../../network/domr/,0755,/opt/xensource/bin
|
|||||||
l2tp_vpn.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_to_secondarystorage.sh=..,0755,/opt/xensource/bin
|
||||||
copy_vhd_from_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_sr.sh=..,0755,/opt/xensource/bin
|
||||||
setup_heartbeat_file.sh=..,0755,/opt/xensource/bin
|
setup_heartbeat_file.sh=..,0755,/opt/xensource/bin
|
||||||
check_heartbeat.sh=..,0755,/opt/xensource/bin
|
check_heartbeat.sh=..,0755,/opt/xensource/bin
|
||||||
|
|||||||
@ -33,6 +33,7 @@ l2tp_vpn.sh=../../../../network/domr/,0755,/opt/xensource/bin
|
|||||||
cloud-setup-bonding.sh=..,0755,/opt/xensource/bin
|
cloud-setup-bonding.sh=..,0755,/opt/xensource/bin
|
||||||
copy_vhd_to_secondarystorage.sh=..,0755,/opt/xensource/bin
|
copy_vhd_to_secondarystorage.sh=..,0755,/opt/xensource/bin
|
||||||
copy_vhd_from_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_sr.sh=..,0755,/opt/xensource/bin
|
||||||
setup_heartbeat_file.sh=..,0755,/opt/xensource/bin
|
setup_heartbeat_file.sh=..,0755,/opt/xensource/bin
|
||||||
check_heartbeat.sh=..,0755,/opt/xensource/bin
|
check_heartbeat.sh=..,0755,/opt/xensource/bin
|
||||||
|
|||||||
@ -33,6 +33,7 @@ l2tp_vpn.sh=../../../../network/domr/,0755,/opt/xensource/bin
|
|||||||
cloud-setup-bonding.sh=..,0755,/opt/xensource/bin
|
cloud-setup-bonding.sh=..,0755,/opt/xensource/bin
|
||||||
copy_vhd_to_secondarystorage.sh=..,0755,/opt/xensource/bin
|
copy_vhd_to_secondarystorage.sh=..,0755,/opt/xensource/bin
|
||||||
copy_vhd_from_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_sr.sh=..,0755,/opt/xensource/bin
|
||||||
setup_heartbeat_file.sh=..,0755,/opt/xensource/bin
|
setup_heartbeat_file.sh=..,0755,/opt/xensource/bin
|
||||||
check_heartbeat.sh=..,0755,/opt/xensource/bin
|
check_heartbeat.sh=..,0755,/opt/xensource/bin
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user