|
26 | 26 | import java.util.TimeZone; |
27 | 27 | import java.util.Timer; |
28 | 28 | import java.util.TimerTask; |
| 29 | +import java.util.stream.Collectors; |
29 | 30 |
|
30 | 31 | import javax.inject.Inject; |
31 | 32 | import javax.naming.ConfigurationException; |
|
61 | 62 | import org.apache.cloudstack.poll.BackgroundPollTask; |
62 | 63 | import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; |
63 | 64 | import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; |
| 65 | +import org.apache.commons.collections.CollectionUtils; |
64 | 66 | import org.apache.log4j.Logger; |
65 | 67 |
|
66 | 68 | import com.cloud.api.ApiDispatcher; |
@@ -333,35 +335,29 @@ public boolean removeVMFromBackupOffering(final Long vmId, final boolean forced) |
333 | 335 | } |
334 | 336 |
|
335 | 337 | boolean result = false; |
336 | | - VMInstanceVO vmInstance = null; |
337 | 338 | try { |
338 | | - vmInstance = vmInstanceDao.acquireInLockTable(vm.getId()); |
339 | | - vmInstance.setBackupOfferingId(null); |
340 | | - vmInstance.setBackupExternalId(null); |
341 | | - vmInstance.setBackupVolumes(null); |
342 | | - result = backupProvider.removeVMFromBackupOffering(vmInstance); |
| 339 | + vm.setBackupOfferingId(null); |
| 340 | + vm.setBackupExternalId(null); |
| 341 | + vm.setBackupVolumes(null); |
| 342 | + result = backupProvider.removeVMFromBackupOffering(vm); |
343 | 343 | if (result && backupProvider.willDeleteBackupsOnOfferingRemoval()) { |
344 | 344 | final List<Backup> backups = backupDao.listByVmId(null, vm.getId()); |
345 | 345 | for (final Backup backup : backups) { |
346 | 346 | backupDao.remove(backup.getId()); |
347 | 347 | } |
348 | 348 | } |
349 | | - if ((result || forced) && vmInstanceDao.update(vmInstance.getId(), vmInstance)) { |
| 349 | + if ((result || forced) && vmInstanceDao.update(vm.getId(), vm)) { |
350 | 350 | UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_BACKUP_OFFERING_REMOVE, vm.getAccountId(), vm.getDataCenterId(), vm.getId(), |
351 | 351 | "Backup-" + vm.getHostName() + "-" + vm.getUuid(), vm.getBackupOfferingId(), null, null, |
352 | 352 | Backup.class.getSimpleName(), vm.getUuid()); |
353 | | - final BackupSchedule backupSchedule = backupScheduleDao.findByVM(vmInstance.getId()); |
| 353 | + final BackupSchedule backupSchedule = backupScheduleDao.findByVM(vm.getId()); |
354 | 354 | if (backupSchedule != null) { |
355 | 355 | backupScheduleDao.remove(backupSchedule.getId()); |
356 | 356 | } |
357 | 357 | result = true; |
358 | 358 | } |
359 | 359 | } catch (final Exception e) { |
360 | 360 | LOG.warn("Exception caught when trying to remove VM from the backup offering: ", e); |
361 | | - } finally { |
362 | | - if (vmInstance != null) { |
363 | | - vmInstanceDao.releaseFromLockTable(vmInstance.getId()); |
364 | | - } |
365 | 361 | } |
366 | 362 | return result; |
367 | 363 | } |
@@ -671,6 +667,14 @@ public boolean deleteBackup(final Long backupId) { |
671 | 667 | if (offering == null) { |
672 | 668 | throw new CloudRuntimeException("VM backup offering ID " + vm.getBackupOfferingId() + " does not exist"); |
673 | 669 | } |
| 670 | + List<Backup> backupsForVm = backupDao.listByVmId(vm.getDataCenterId(), vmId); |
| 671 | + if (CollectionUtils.isNotEmpty(backupsForVm)) { |
| 672 | + backupsForVm = backupsForVm.stream().filter(vmBackup -> vmBackup.getId() != backupId).collect(Collectors.toList()); |
| 673 | + if (backupsForVm.size() <= 0 && vm.getRemoved() != null) { |
| 674 | + removeVMFromBackupOffering(vmId, true); |
| 675 | + } |
| 676 | + } |
| 677 | + |
674 | 678 | final BackupProvider backupProvider = getBackupProvider(offering.getProvider()); |
675 | 679 | boolean result = backupProvider.deleteBackup(backup); |
676 | 680 | if (result) { |
|
0 commit comments