Skip to content

Commit cfb35d2

Browse files
Retry cloneVM task when any file access issue while cloning from volume or template
1 parent 5cb279b commit cfb35d2

File tree

1 file changed

+33
-21
lines changed

1 file changed

+33
-21
lines changed

vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -788,11 +788,8 @@ public VirtualMachineMO createFullCloneWithSpecificDisk(String cloneName, Manage
788788
cloneSpec.setMemory(false);
789789
cloneSpec.setConfig(vmConfigSpec);
790790

791-
ManagedObjectReference morTask = _context.getService().cloneVMTask(_mor, morFolder, cloneName, cloneSpec);
792-
793-
boolean result = _context.getVimClient().waitForTask(morTask);
791+
boolean result = cloneVM(cloneName, morFolder, cloneSpec);
794792
if (result) {
795-
_context.waitForTaskProgressDone(morTask);
796793
VirtualMachineMO clonedVm = dcMo.findVm(cloneName);
797794
if (clonedVm == null) {
798795
logger.error(String.format("Failed to clone Instance %s", cloneName));
@@ -802,10 +799,9 @@ public VirtualMachineMO createFullCloneWithSpecificDisk(String cloneName, Manage
802799
clonedVm.tagAsWorkerVM();
803800
makeSureVMHasOnlyRequiredDisk(clonedVm, requiredDisk, dsMo, dcMo);
804801
return clonedVm;
805-
} else {
806-
logger.error("VMware cloneVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
807-
return null;
808802
}
803+
804+
return null;
809805
}
810806

811807
private void makeSureVMHasOnlyRequiredDisk(VirtualMachineMO clonedVm, VirtualDisk requiredDisk, DatastoreMO dsMo, DatacenterMO dcMo) throws Exception {
@@ -852,16 +848,42 @@ public boolean createFullClone(String cloneName, ManagedObjectReference morFolde
852848

853849
setDiskProvisioningType(relocSpec, morDs, diskProvisioningType);
854850

855-
ManagedObjectReference morTask = _context.getService().cloneVMTask(_mor, morFolder, cloneName, cloneSpec);
851+
return cloneVM(cloneName, morFolder, cloneSpec);
852+
}
856853

854+
private boolean cloneVMTask(String cloneName, ManagedObjectReference morFolder, VirtualMachineCloneSpec cloneSpec) throws Exception {
855+
ManagedObjectReference morTask = _context.getService().cloneVMTask(_mor, morFolder, cloneName, cloneSpec);
857856
boolean result = _context.getVimClient().waitForTask(morTask);
858857
if (result) {
859858
_context.waitForTaskProgressDone(morTask);
860859
return true;
861-
} else {
862-
logger.error("VMware cloneVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
863860
}
864861

862+
logger.error("VMware cloneVM_Task failed due to {}", TaskMO.getTaskFailureInfo(_context, morTask));
863+
return false;
864+
}
865+
866+
private boolean cloneVM(final String cloneName, final ManagedObjectReference morFolder, final VirtualMachineCloneSpec cloneSpec) throws Exception {
867+
final int retry = 20;
868+
int retryAttempt = 0;
869+
while (++retryAttempt <= retry) {
870+
try {
871+
logger.debug("Cloning VM {}, attempt #{}", cloneName, retryAttempt);
872+
return cloneVMTask(cloneName, morFolder, cloneSpec);
873+
} catch (Exception e) {
874+
logger.info("Got exception while cloning VM {}", cloneName, e);
875+
if (e.getMessage() != null && e.getMessage().contains("Unable to access file")) {
876+
logger.debug("Failed to clone VM {}. Retrying", cloneName);
877+
try {
878+
Thread.sleep(1000);
879+
} catch (InterruptedException ie) {
880+
logger.debug("Waiting to clone VM {} been interrupted: ", cloneName);
881+
}
882+
} else {
883+
throw e;
884+
}
885+
}
886+
}
865887
return false;
866888
}
867889

@@ -925,17 +947,7 @@ public boolean createLinkedClone(String cloneName, ManagedObjectReference morBas
925947
cloneSpec.setLocation(rSpec);
926948
cloneSpec.setSnapshot(morBaseSnapshot);
927949

928-
ManagedObjectReference morTask = _context.getService().cloneVMTask(_mor, morFolder, cloneName, cloneSpec);
929-
930-
boolean result = _context.getVimClient().waitForTask(morTask);
931-
if (result) {
932-
_context.waitForTaskProgressDone(morTask);
933-
return true;
934-
} else {
935-
logger.error("VMware cloneVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
936-
}
937-
938-
return false;
950+
return cloneVM(cloneName, morFolder, cloneSpec);
939951
}
940952

941953
public VirtualMachineRuntimeInfo getRuntimeInfo() throws Exception {

0 commit comments

Comments
 (0)