Skip to content

Commit 6df3ef2

Browse files
committed
Backup: remove the stored usage metric with its usage event atomically
Publish the usage event for an offering whose backups are all gone and delete its row in backup_usage_metric in one transaction, as is already done when publishing the metric, so a stale stored value cannot outlive the usage.
1 parent 48169b4 commit 6df3ef2

1 file changed

Lines changed: 17 additions & 7 deletions

File tree

‎server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java‎

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -546,10 +546,7 @@ public boolean removeVMFromBackupOffering(final Long vmId, final boolean forced)
546546
if ((result || forced) && vmInstanceDao.update(vm.getId(), vm)) {
547547
final List<Backup> backups = backupDao.listByVmId(null, vm.getId());
548548
if (backups.size() == 0) {
549-
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_BACKUP_OFFERING_REMOVED_AND_BACKUPS_DELETED, vm.getAccountId(), vm.getDataCenterId(), vm.getId(),
550-
"Backup-" + vm.getHostName() + "-" + vm.getUuid(), backupOfferingId, null, null,
551-
Backup.class.getSimpleName(), vm.getUuid());
552-
backupUsageMetricDao.removeByVmAndOffering(vm.getId(), backupOfferingId);
549+
publishBackupOfferingUsageRemoved(vm, backupOfferingId);
553550
}
554551
final List<BackupScheduleVO> backupSchedules = backupScheduleDao.listByVM(vm.getId());
555552
for(BackupSchedule backupSchedule: backupSchedules) {
@@ -1657,12 +1654,25 @@ private void checkAndGenerateUsageForLastBackupDeletedAfterOfferingRemove(Virtua
16571654
(vm.getBackupOfferingId() == null || vm.getBackupOfferingId() != backup.getBackupOfferingId())) {
16581655
List<Backup> backups = backupDao.listByVmIdAndOffering(vm.getDataCenterId(), vm.getId(), backup.getBackupOfferingId());
16591656
if (backups.size() == 0) {
1657+
publishBackupOfferingUsageRemoved(vm, backup.getBackupOfferingId());
1658+
}
1659+
}
1660+
}
1661+
1662+
/**
1663+
* Publishes the usage event for an offering whose backups are all gone and forgets the backup usage metric last
1664+
* published for it, in one transaction so that the stored metric never outlives its usage.
1665+
*/
1666+
private void publishBackupOfferingUsageRemoved(final VirtualMachine vm, final long backupOfferingId) {
1667+
Transaction.execute(new TransactionCallbackNoReturn() {
1668+
@Override
1669+
public void doInTransactionWithoutResult(TransactionStatus status) {
16601670
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_BACKUP_OFFERING_REMOVED_AND_BACKUPS_DELETED, vm.getAccountId(),
16611671
vm.getDataCenterId(), vm.getId(), "Backup-" + vm.getHostName() + "-" + vm.getUuid(),
1662-
backup.getBackupOfferingId(), null, null, Backup.class.getSimpleName(), vm.getUuid());
1663-
backupUsageMetricDao.removeByVmAndOffering(vm.getId(), backup.getBackupOfferingId());
1672+
backupOfferingId, null, null, Backup.class.getSimpleName(), vm.getUuid());
1673+
backupUsageMetricDao.removeByVmAndOffering(vm.getId(), backupOfferingId);
16641674
}
1665-
}
1675+
});
16661676
}
16671677

16681678
@Override

0 commit comments

Comments
 (0)