This is an automated email from the ASF dual-hosted git repository.
dahn pushed a commit to branch 4.20
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.20 by this push:
new a29de0ed066 Retry cloneVM task when any file access issue while
cloning from volume or template (#12335)
a29de0ed066 is described below
commit a29de0ed0665ea97a8bcdf35a2651b4f5df26494
Author: Suresh Kumar Anaparti <[email protected]>
AuthorDate: Mon Jan 5 21:00:39 2026 +0530
Retry cloneVM task when any file access issue while cloning from volume or
template (#12335)
---
.../hypervisor/vmware/mo/VirtualMachineMO.java | 54 +++++++++++++---------
1 file changed, 33 insertions(+), 21 deletions(-)
diff --git
a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
index 9802328827a..950ec9010cb 100644
---
a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
+++
b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
@@ -788,11 +788,8 @@ public class VirtualMachineMO extends BaseMO {
cloneSpec.setMemory(false);
cloneSpec.setConfig(vmConfigSpec);
- ManagedObjectReference morTask =
_context.getService().cloneVMTask(_mor, morFolder, cloneName, cloneSpec);
-
- boolean result = _context.getVimClient().waitForTask(morTask);
+ boolean result = cloneVM(cloneName, morFolder, cloneSpec);
if (result) {
- _context.waitForTaskProgressDone(morTask);
VirtualMachineMO clonedVm = dcMo.findVm(cloneName);
if (clonedVm == null) {
logger.error(String.format("Failed to clone Instance %s",
cloneName));
@@ -802,10 +799,9 @@ public class VirtualMachineMO extends BaseMO {
clonedVm.tagAsWorkerVM();
makeSureVMHasOnlyRequiredDisk(clonedVm, requiredDisk, dsMo, dcMo);
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
{
@@ -852,16 +848,42 @@ public class VirtualMachineMO extends BaseMO {
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);
if (result) {
_context.waitForTaskProgressDone(morTask);
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;
}
@@ -925,17 +947,7 @@ public class VirtualMachineMO extends BaseMO {
cloneSpec.setLocation(rSpec);
cloneSpec.setSnapshot(morBaseSnapshot);
- ManagedObjectReference morTask =
_context.getService().cloneVMTask(_mor, morFolder, cloneName, 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;
+ return cloneVM(cloneName, morFolder, cloneSpec);
}
public VirtualMachineRuntimeInfo getRuntimeInfo() throws Exception {