Skip to content

Commit 74b1c2a

Browse files
author
Fabrício Duarte
committed
Merge branch 'avoid-migration-while-compressing-backup' into '4.20.0.0-scclouds'
Bloquear migração de dados caso haja backups em processo de compressão See merge request scclouds/scclouds!1332
2 parents 7e1e3f7 + 30f8106 commit 74b1c2a

4 files changed

Lines changed: 53 additions & 4 deletions

File tree

engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/DataMigrationUtility.java

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,6 @@ public class DataMigrationUtility {
103103
*/
104104
public boolean filesReadyToMigrate(List<TemplateDataStoreVO> templates, List<SnapshotDataStoreVO> snapshots, List<VolumeDataStoreVO> volumes, List<NativeBackupJoinVO> backups) {
105105
State[] validStates = {State.Ready, State.Allocated, State.Destroying, State.Destroyed, State.Failed, State.Hidden};
106-
List<Backup.Status> validBackupStates = List.of(Backup.Status.BackedUp, Backup.Status.Allocated, Backup.Status.Error, Backup.Status.Failed, Backup.Status.Expunged, Backup.Status.Removed, Backup.Status.Queued);
107106
boolean isReady = true;
108107
for (TemplateDataStoreVO template : templates) {
109108
isReady &= (Arrays.asList(validStates).contains(template.getState()));
@@ -117,11 +116,39 @@ public boolean filesReadyToMigrate(List<TemplateDataStoreVO> templates, List<Sna
117116
isReady &= (Arrays.asList(validStates).contains(volume.getState()));
118117
logger.trace("volume state: {}", volume.getState());
119118
}
119+
isReady &= checkIfBackupsMigrationIsPossible(backups);
120+
return isReady;
121+
}
122+
123+
private boolean checkIfBackupsMigrationIsPossible(List<NativeBackupJoinVO> backups) {
124+
List<Backup.Status> invalidBackupStates = Arrays.asList(Backup.Status.BackingUp, Backup.Status.Restoring);
125+
List<Backup.CompressionStatus> invalidBackupCompressionStatus = Arrays.asList(Backup.CompressionStatus.Compressing, Backup.CompressionStatus.FinalizingCompression);
126+
127+
List<List<BackupObject>> backupChains;
128+
Set<Long> backupIdsAlreadyInChain = new HashSet<>();
129+
120130
for (NativeBackupJoinVO backup : backups) {
121-
isReady &= validBackupStates.contains(backup.getStatus());
122-
logger.trace("Backup [{}] of VM [{}] has the status [{}].", backup.getUuid(), backup.getVmId(), backup.getStatus());
131+
if (backup.getStatus() == Backup.Status.BackedUp && !backupIdsAlreadyInChain.contains(backup.getId())) {
132+
backupChains = createBackupChain(backup);
133+
backupChains.forEach(list -> backupIdsAlreadyInChain.add(list.stream().map(BackupObject::getId).findFirst().get()));
134+
135+
for (List<BackupObject> backupVolumeChain : backupChains) {
136+
BackupObject backupObject = backupVolumeChain.get(0);
137+
138+
if (invalidBackupStates.contains(backupObject.getStatus())) {
139+
logger.debug("Migration is not possible because backup {} is in {} state.", backupObject.getUuid(), backupObject.getStatus());
140+
return false;
141+
}
142+
143+
if (invalidBackupCompressionStatus.contains(backupObject.getCompressionStatus())) {
144+
logger.debug("Migration is not possible because backup {} is currently being compressed. Current compression status: {}.", backupObject.getUuid(), backupObject.getCompressionStatus());
145+
return false;
146+
}
147+
}
148+
}
123149
}
124-
return isReady;
150+
151+
return true;
125152
}
126153

127154
private boolean filesReadyToMigrate(Long srcDataStoreId) {

engine/schema/src/main/java/org/apache/cloudstack/backup/NativeBackupJoinVO.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ public class NativeBackupJoinVO {
7373
@Column(name = "status")
7474
private Backup.Status status;
7575

76+
@Enumerated(value = EnumType.STRING)
77+
@Column(name = "compression_status")
78+
private Backup.CompressionStatus compressionStatus;
79+
7680
@Column(name = "end_of_chain")
7781
private Boolean endOfChain;
7882

@@ -175,6 +179,10 @@ public Boolean getIsolated() {
175179
return BooleanUtils.isTrue(isolated);
176180
}
177181

182+
public Backup.CompressionStatus getCompressionStatus() {
183+
return compressionStatus;
184+
}
185+
178186
@Override
179187
public String toString() {
180188
return ReflectionToStringBuilder.toString(this, ToStringStyle.JSON_STYLE);

engine/schema/src/main/resources/META-INF/db/views/cloud.native_backup_view.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ SELECT b.id,
2626
b.type,
2727
b.date,
2828
b.status,
29+
b.compression_status,
2930
b.backup_offering_id,
3031
b.size,
3132
b.protected_size,

engine/storage/src/main/java/org/apache/cloudstack/storage/backup/BackupObject.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.cloud.hypervisor.Hypervisor;
2626
import com.cloud.storage.DataStoreRole;
2727
import com.cloud.utils.component.ComponentContext;
28+
import org.apache.cloudstack.backup.Backup;
2829
import org.apache.cloudstack.backup.NativeBackupJoinVO;
2930
import org.apache.cloudstack.backup.dao.NativeBackupJoinDao;
3031
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
@@ -49,6 +50,8 @@ public class BackupObject implements DataObject {
4950
private long physicalSize;
5051
private DataStore dataStore;
5152
private String imageStorePath;
53+
private Backup.Status status;
54+
private Backup.CompressionStatus compressionStatus;
5255

5356
@Inject
5457
NativeBackupJoinDao nativeBackupJoinDao;
@@ -72,6 +75,8 @@ private void configure(NativeBackupJoinVO nativeBackupJoin) {
7275
this.size = nativeBackupJoin.getProtectedSize();
7376
this.physicalSize = nativeBackupJoin.getSize();
7477
this.imageStorePath = nativeBackupJoin.getImageStorePath();
78+
this.status = nativeBackupJoin.getStatus();
79+
this.compressionStatus = nativeBackupJoin.getCompressionStatus();
7580
this.dataStore = storeManager.getDataStore(nativeBackupJoin.getImageStoreId(), DataStoreRole.Image);
7681
}
7782

@@ -182,4 +187,12 @@ public Long getZoneId() {
182187
public String toString() {
183188
return uuid;
184189
}
190+
191+
public Backup.CompressionStatus getCompressionStatus() {
192+
return compressionStatus;
193+
}
194+
195+
public Backup.Status getStatus() {
196+
return status;
197+
}
185198
}

0 commit comments

Comments
 (0)