@@ -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