Skip to content

Commit 27e4d97

Browse files
Clean up backup references to their schedules when the schedules are deleted (#12401)
* clean up backup schedule references after their deletion * drop unused column * address reviews
1 parent 80ee7f1 commit 27e4d97

5 files changed

Lines changed: 38 additions & 43 deletions

File tree

engine/schema/src/main/java/org/apache/cloudstack/backup/dao/BackupScheduleDao.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,14 @@
2121
import java.util.List;
2222

2323
import com.cloud.utils.DateUtil;
24-
import org.apache.cloudstack.api.response.BackupScheduleResponse;
25-
import org.apache.cloudstack.backup.BackupSchedule;
2624
import org.apache.cloudstack.backup.BackupScheduleVO;
2725

2826
import com.cloud.utils.db.GenericDao;
2927

3028
public interface BackupScheduleDao extends GenericDao<BackupScheduleVO, Long> {
31-
BackupScheduleVO findByVM(Long vmId);
32-
3329
List<BackupScheduleVO> listByVM(Long vmId);
3430

3531
BackupScheduleVO findByVMAndIntervalType(Long vmId, DateUtil.IntervalType intervalType);
3632

3733
List<BackupScheduleVO> getSchedulesToExecute(Date currentTimestamp);
38-
39-
BackupScheduleResponse newBackupScheduleResponse(BackupSchedule schedule);
4034
}

engine/schema/src/main/java/org/apache/cloudstack/backup/dao/BackupScheduleDaoImpl.java

Lines changed: 16 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,28 +17,23 @@
1717

1818
package org.apache.cloudstack.backup.dao;
1919

20+
import java.sql.PreparedStatement;
21+
import java.sql.SQLException;
2022
import java.util.Date;
2123
import java.util.List;
2224

2325
import javax.annotation.PostConstruct;
24-
import javax.inject.Inject;
2526

2627
import com.cloud.utils.DateUtil;
27-
import org.apache.cloudstack.api.response.BackupScheduleResponse;
28-
import org.apache.cloudstack.backup.BackupSchedule;
28+
import com.cloud.utils.db.DB;
29+
import com.cloud.utils.db.TransactionLegacy;
2930
import org.apache.cloudstack.backup.BackupScheduleVO;
3031

3132
import com.cloud.utils.db.GenericDaoBase;
3233
import com.cloud.utils.db.SearchBuilder;
3334
import com.cloud.utils.db.SearchCriteria;
34-
import com.cloud.vm.VMInstanceVO;
35-
import com.cloud.vm.dao.VMInstanceDao;
3635

3736
public class BackupScheduleDaoImpl extends GenericDaoBase<BackupScheduleVO, Long> implements BackupScheduleDao {
38-
39-
@Inject
40-
VMInstanceDao vmInstanceDao;
41-
4237
private SearchBuilder<BackupScheduleVO> backupScheduleSearch;
4338
private SearchBuilder<BackupScheduleVO> executableSchedulesSearch;
4439

@@ -59,13 +54,6 @@ protected void init() {
5954
executableSchedulesSearch.done();
6055
}
6156

62-
@Override
63-
public BackupScheduleVO findByVM(Long vmId) {
64-
SearchCriteria<BackupScheduleVO> sc = backupScheduleSearch.create();
65-
sc.setParameters("vm_id", vmId);
66-
return findOneBy(sc);
67-
}
68-
6957
@Override
7058
public List<BackupScheduleVO> listByVM(Long vmId) {
7159
SearchCriteria<BackupScheduleVO> sc = backupScheduleSearch.create();
@@ -88,21 +76,19 @@ public List<BackupScheduleVO> getSchedulesToExecute(Date currentTimestamp) {
8876
return listBy(sc);
8977
}
9078

79+
@DB
9180
@Override
92-
public BackupScheduleResponse newBackupScheduleResponse(BackupSchedule schedule) {
93-
VMInstanceVO vm = vmInstanceDao.findByIdIncludingRemoved(schedule.getVmId());
94-
BackupScheduleResponse response = new BackupScheduleResponse();
95-
response.setId(schedule.getUuid());
96-
response.setVmId(vm.getUuid());
97-
response.setVmName(vm.getHostName());
98-
response.setIntervalType(schedule.getScheduleType());
99-
response.setSchedule(schedule.getSchedule());
100-
response.setTimezone(schedule.getTimezone());
101-
response.setMaxBackups(schedule.getMaxBackups());
102-
if (schedule.getQuiesceVM() != null) {
103-
response.setQuiesceVM(schedule.getQuiesceVM());
81+
public boolean remove(Long id) {
82+
String sql = "UPDATE backups SET backup_schedule_id = NULL WHERE backup_schedule_id = ?";
83+
TransactionLegacy transaction = TransactionLegacy.currentTxn();
84+
try {
85+
PreparedStatement preparedStatement = transaction.prepareAutoCloseStatement(sql);
86+
preparedStatement.setLong(1, id);
87+
preparedStatement.executeUpdate();
88+
return super.remove(id);
89+
} catch (SQLException e) {
90+
logger.warn("Unable to clean up backup schedules references from the backups table.", e);
91+
return false;
10492
}
105-
response.setObjectName("backupschedule");
106-
return response;
10793
}
10894
}

engine/schema/src/main/resources/META-INF/db/schema-42200to42210.sql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,6 @@ UPDATE `cloud`.`vm_template` SET guest_os_id = 99 WHERE name = 'kvm-default-vm-i
3838

3939
-- Update existing vm_template records with NULL type to "USER"
4040
UPDATE `cloud`.`vm_template` SET `type` = 'USER' WHERE `type` IS NULL;
41+
42+
-- Drops the unused "backup_interval_type" column of the "cloud.backups" table
43+
ALTER TABLE `cloud`.`backups` DROP COLUMN `backup_interval_type`;

server/src/main/java/com/cloud/api/ApiDBUtils.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
import org.apache.cloudstack.api.response.AccountResponse;
4646
import org.apache.cloudstack.api.response.AsyncJobResponse;
4747
import org.apache.cloudstack.api.response.BackupOfferingResponse;
48-
import org.apache.cloudstack.api.response.BackupScheduleResponse;
4948
import org.apache.cloudstack.api.response.DiskOfferingResponse;
5049
import org.apache.cloudstack.api.response.DomainResponse;
5150
import org.apache.cloudstack.api.response.DomainRouterResponse;
@@ -76,7 +75,6 @@
7675
import org.apache.cloudstack.api.response.ZoneResponse;
7776
import org.apache.cloudstack.backup.BackupOffering;
7877
import org.apache.cloudstack.backup.BackupRepository;
79-
import org.apache.cloudstack.backup.BackupSchedule;
8078
import org.apache.cloudstack.backup.dao.BackupDao;
8179
import org.apache.cloudstack.backup.dao.BackupOfferingDao;
8280
import org.apache.cloudstack.backup.dao.BackupRepositoryDao;
@@ -2299,10 +2297,6 @@ public static ResourceIconVO getResourceIconByResourceUUID(String resourceUUID,
22992297
return s_resourceIconDao.findByResourceUuid(resourceUUID, resourceType);
23002298
}
23012299

2302-
public static BackupScheduleResponse newBackupScheduleResponse(BackupSchedule schedule) {
2303-
return s_backupScheduleDao.newBackupScheduleResponse(schedule);
2304-
}
2305-
23062300
public static BackupOfferingResponse newBackupOfferingResponse(BackupOffering offering) {
23072301
BackupRepository repository = s_backupRepositoryDao.findByUuid(offering.getExternalId());
23082302
Boolean crossZoneInstanceCreationEnabled = repository != null ? Boolean.TRUE.equals(repository.crossZoneInstanceCreationEnabled()) : false;

server/src/main/java/com/cloud/api/ApiResponseHelper.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5042,7 +5042,25 @@ public UserDataResponse createUserDataResponse(UserData userData) {
50425042

50435043
@Override
50445044
public BackupScheduleResponse createBackupScheduleResponse(BackupSchedule schedule) {
5045-
return ApiDBUtils.newBackupScheduleResponse(schedule);
5045+
BackupScheduleResponse response = new BackupScheduleResponse();
5046+
response.setId(schedule.getUuid());
5047+
response.setIntervalType(schedule.getScheduleType());
5048+
response.setSchedule(schedule.getSchedule());
5049+
response.setTimezone(schedule.getTimezone());
5050+
response.setMaxBackups(schedule.getMaxBackups());
5051+
5052+
if (schedule.getQuiesceVM() != null) {
5053+
response.setQuiesceVM(schedule.getQuiesceVM());
5054+
}
5055+
5056+
VMInstanceVO vm = ApiDBUtils.findVMInstanceById(schedule.getVmId());
5057+
if (vm != null) {
5058+
response.setVmId(vm.getUuid());
5059+
response.setVmName(vm.getHostName());
5060+
}
5061+
5062+
response.setObjectName("backupschedule");
5063+
return response;
50465064
}
50475065

50485066
@Override

0 commit comments

Comments
 (0)