mirror of https://github.com/apache/cloudstack.git
Retry cloneVM task when any file access issue while cloning from volume or template (#12335)
This commit is contained in:
parent
fca928d609
commit
a29de0ed06
|
|
@ -788,11 +788,8 @@ public class VirtualMachineMO extends BaseMO {
|
||||||
cloneSpec.setMemory(false);
|
cloneSpec.setMemory(false);
|
||||||
cloneSpec.setConfig(vmConfigSpec);
|
cloneSpec.setConfig(vmConfigSpec);
|
||||||
|
|
||||||
ManagedObjectReference morTask = _context.getService().cloneVMTask(_mor, morFolder, cloneName, cloneSpec);
|
boolean result = cloneVM(cloneName, morFolder, cloneSpec);
|
||||||
|
|
||||||
boolean result = _context.getVimClient().waitForTask(morTask);
|
|
||||||
if (result) {
|
if (result) {
|
||||||
_context.waitForTaskProgressDone(morTask);
|
|
||||||
VirtualMachineMO clonedVm = dcMo.findVm(cloneName);
|
VirtualMachineMO clonedVm = dcMo.findVm(cloneName);
|
||||||
if (clonedVm == null) {
|
if (clonedVm == null) {
|
||||||
logger.error(String.format("Failed to clone Instance %s", cloneName));
|
logger.error(String.format("Failed to clone Instance %s", cloneName));
|
||||||
|
|
@ -802,10 +799,9 @@ public class VirtualMachineMO extends BaseMO {
|
||||||
clonedVm.tagAsWorkerVM();
|
clonedVm.tagAsWorkerVM();
|
||||||
makeSureVMHasOnlyRequiredDisk(clonedVm, requiredDisk, dsMo, dcMo);
|
makeSureVMHasOnlyRequiredDisk(clonedVm, requiredDisk, dsMo, dcMo);
|
||||||
return clonedVm;
|
return clonedVm;
|
||||||
} else {
|
|
||||||
logger.error("VMware cloneVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void makeSureVMHasOnlyRequiredDisk(VirtualMachineMO clonedVm, VirtualDisk requiredDisk, DatastoreMO dsMo, DatacenterMO dcMo) throws Exception {
|
private void makeSureVMHasOnlyRequiredDisk(VirtualMachineMO clonedVm, VirtualDisk requiredDisk, DatastoreMO dsMo, DatacenterMO dcMo) throws Exception {
|
||||||
|
|
@ -852,16 +848,42 @@ public class VirtualMachineMO extends BaseMO {
|
||||||
|
|
||||||
setDiskProvisioningType(relocSpec, morDs, diskProvisioningType);
|
setDiskProvisioningType(relocSpec, morDs, diskProvisioningType);
|
||||||
|
|
||||||
ManagedObjectReference morTask = _context.getService().cloneVMTask(_mor, morFolder, cloneName, cloneSpec);
|
return cloneVM(cloneName, morFolder, cloneSpec);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean cloneVMTask(String cloneName, ManagedObjectReference morFolder, VirtualMachineCloneSpec cloneSpec) throws Exception {
|
||||||
|
ManagedObjectReference morTask = _context.getService().cloneVMTask(_mor, morFolder, cloneName, cloneSpec);
|
||||||
boolean result = _context.getVimClient().waitForTask(morTask);
|
boolean result = _context.getVimClient().waitForTask(morTask);
|
||||||
if (result) {
|
if (result) {
|
||||||
_context.waitForTaskProgressDone(morTask);
|
_context.waitForTaskProgressDone(morTask);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
|
||||||
logger.error("VMware cloneVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.error("VMware cloneVM_Task failed due to {}", TaskMO.getTaskFailureInfo(_context, morTask));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean cloneVM(final String cloneName, final ManagedObjectReference morFolder, final VirtualMachineCloneSpec cloneSpec) throws Exception {
|
||||||
|
final int retry = 20;
|
||||||
|
int retryAttempt = 0;
|
||||||
|
while (++retryAttempt <= retry) {
|
||||||
|
try {
|
||||||
|
logger.debug("Cloning VM {}, attempt #{}", cloneName, retryAttempt);
|
||||||
|
return cloneVMTask(cloneName, morFolder, cloneSpec);
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.info("Got exception while cloning VM {}", cloneName, e);
|
||||||
|
if (e.getMessage() != null && e.getMessage().contains("Unable to access file")) {
|
||||||
|
logger.debug("Failed to clone VM {}. Retrying", cloneName);
|
||||||
|
try {
|
||||||
|
Thread.sleep(1000);
|
||||||
|
} catch (InterruptedException ie) {
|
||||||
|
logger.debug("Waiting to clone VM {} been interrupted: ", cloneName);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -925,17 +947,7 @@ public class VirtualMachineMO extends BaseMO {
|
||||||
cloneSpec.setLocation(rSpec);
|
cloneSpec.setLocation(rSpec);
|
||||||
cloneSpec.setSnapshot(morBaseSnapshot);
|
cloneSpec.setSnapshot(morBaseSnapshot);
|
||||||
|
|
||||||
ManagedObjectReference morTask = _context.getService().cloneVMTask(_mor, morFolder, cloneName, cloneSpec);
|
return cloneVM(cloneName, morFolder, cloneSpec);
|
||||||
|
|
||||||
boolean result = _context.getVimClient().waitForTask(morTask);
|
|
||||||
if (result) {
|
|
||||||
_context.waitForTaskProgressDone(morTask);
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
logger.error("VMware cloneVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public VirtualMachineRuntimeInfo getRuntimeInfo() throws Exception {
|
public VirtualMachineRuntimeInfo getRuntimeInfo() throws Exception {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue