This is an automated email from the ASF dual-hosted git repository.

sureshanaparti pushed a commit to branch 4.22
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.22 by this push:
     new 1f5dba9bd2d Release reserved storage resources on VM deployment 
failure (#13048)
1f5dba9bd2d is described below

commit 1f5dba9bd2d33e95c63cc04b57df51b5c7921630
Author: Fabricio Duarte <[email protected]>
AuthorDate: Thu Apr 30 12:22:35 2026 -0300

    Release reserved storage resources on VM deployment failure (#13048)
---
 .../META-INF/db/schema-42200to42210-cleanup.sql    |  6 ++++++
 .../main/java/com/cloud/vm/UserVmManagerImpl.java  | 24 +++++++---------------
 2 files changed, 13 insertions(+), 17 deletions(-)

diff --git 
a/engine/schema/src/main/resources/META-INF/db/schema-42200to42210-cleanup.sql 
b/engine/schema/src/main/resources/META-INF/db/schema-42200to42210-cleanup.sql
index 54baf226ac4..2f104568c14 100644
--- 
a/engine/schema/src/main/resources/META-INF/db/schema-42200to42210-cleanup.sql
+++ 
b/engine/schema/src/main/resources/META-INF/db/schema-42200to42210-cleanup.sql
@@ -18,3 +18,9 @@
 --;
 -- Schema upgrade cleanup from 4.22.0.0 to 4.22.1.0
 --;
+
+-- Entries remaining on `cloud`.`resource_reservation` during the upgrade 
process are stale, so delete them.
+-- This script was added to normalize volume/primary storage reservations that 
got stuck due to a bug on VM deployment,
+-- but it is more interesting to introduce a smarter logic to clean these 
stale reservations in the future without the need
+-- for upgrades (for instance, by having a heartbeat_time column for the 
reservations and automatically cleaning old entries).
+DELETE FROM `cloud`.`resource_reservation`;
diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java 
b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
index fe18263fd3b..b23291586ef 100644
--- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
@@ -4301,9 +4301,7 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
         return 
resourceLimitService.getResourceLimitStorageTags(diskOfferingVO);
     }
 
-    private List<CheckedReservation> reserveStorageResourcesForVm(Account 
owner, Long diskOfferingId, Long diskSize, List<VmDiskInfo> dataDiskInfoList, 
Long rootDiskOfferingId, ServiceOfferingVO offering, Long rootDiskSize) throws 
ResourceAllocationException {
-        List <CheckedReservation> checkedReservations = new ArrayList<>();
-
+    private void reserveStorageResourcesForVm(List<Reserver> 
checkedReservations, Account owner, Long diskOfferingId, Long diskSize, 
List<VmDiskInfo> dataDiskInfoList, Long rootDiskOfferingId, ServiceOfferingVO 
offering, Long rootDiskSize) throws ResourceAllocationException {
         List<String> rootResourceLimitStorageTags = 
getResourceLimitStorageTags(rootDiskOfferingId != null ? rootDiskOfferingId : 
offering.getDiskOfferingId());
         CheckedReservation rootVolumeReservation = new 
CheckedReservation(owner, ResourceType.volume, rootResourceLimitStorageTags, 
1L, reservationDao, resourceLimitService);
         checkedReservations.add(rootVolumeReservation);
@@ -4311,12 +4309,12 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
         checkedReservations.add(rootPrimaryStorageReservation);
 
         if (diskOfferingId != null) {
-            List<String> additionalResourceLimitStorageTags = diskOfferingId 
!= null ? getResourceLimitStorageTags(diskOfferingId) : null;
+            List<String> additionalResourceLimitStorageTags = 
getResourceLimitStorageTags(diskOfferingId);
             DiskOfferingVO diskOffering = 
_diskOfferingDao.findById(diskOfferingId);
             Long size = verifyAndGetDiskSize(diskOffering, diskSize);
-            CheckedReservation additionalVolumeReservation = diskOfferingId != 
null ? new CheckedReservation(owner, ResourceType.volume, 
additionalResourceLimitStorageTags, 1L, reservationDao, resourceLimitService) : 
null;
+            CheckedReservation additionalVolumeReservation = new 
CheckedReservation(owner, ResourceType.volume, 
additionalResourceLimitStorageTags, 1L, reservationDao, resourceLimitService);
             checkedReservations.add(additionalVolumeReservation);
-            CheckedReservation additionalPrimaryStorageReservation = 
diskOfferingId != null ? new CheckedReservation(owner, 
ResourceType.primary_storage, additionalResourceLimitStorageTags, size, 
reservationDao, resourceLimitService) : null;
+            CheckedReservation additionalPrimaryStorageReservation = new 
CheckedReservation(owner, ResourceType.primary_storage, 
additionalResourceLimitStorageTags, size, reservationDao, resourceLimitService);
             checkedReservations.add(additionalPrimaryStorageReservation);
 
         }
@@ -4332,7 +4330,6 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
                 checkedReservations.add(additionalPrimaryStorageReservation);
             }
         }
-        return checkedReservations;
     }
 
     private UserVm getUncheckedUserVmResource(DataCenter zone, String 
hostName, String displayName, Account owner,
@@ -4344,10 +4341,10 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
         Map<String, String> userVmOVFPropertiesMap, boolean 
dynamicScalingEnabled, String vmType, VMTemplateVO template,
         HypervisorType hypervisorType, long accountId, ServiceOfferingVO 
offering, boolean isIso,
         Long rootDiskOfferingId, long volumesSize, Volume volume, Snapshot 
snapshot) throws ResourceAllocationException {
-        List<CheckedReservation> checkedReservations = new ArrayList<>();
+        List<Reserver> checkedReservations = new ArrayList<>();
 
         try {
-            checkedReservations = reserveStorageResourcesForVm(owner, 
diskOfferingId, diskSize, dataDiskInfoList, rootDiskOfferingId, offering, 
volumesSize);
+            reserveStorageResourcesForVm(checkedReservations, owner, 
diskOfferingId, diskSize, dataDiskInfoList, rootDiskOfferingId, offering, 
volumesSize);
 
             // verify security group ids
             if (securityGroupIdList != null) {
@@ -4638,14 +4635,7 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
             logger.error("error during resource reservation and allocation", 
e);
             throw new CloudRuntimeException(e);
         } finally {
-            for (CheckedReservation checkedReservation : checkedReservations) {
-                try {
-                    checkedReservation.close();
-                } catch (Exception e) {
-                    logger.error("error during resource reservation and 
allocation", e);
-                    throw new CloudRuntimeException(e);
-                }
-            }
+            ReservationHelper.closeAll(checkedReservations);
         }
     }
 

Reply via email to