mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	StorPool: fix of delete snapshot (#9855)
* StorPool: fix of delete snapshot Mark the DB record as destroyed when a snapshot is deleted * Addressed reviews * addressed review * addressed review
This commit is contained in:
		
							parent
							
								
									019f2c60ce
								
							
						
					
					
						commit
						be247334a7
					
				| @ -138,6 +138,8 @@ public class StorPoolUtil { | ||||
| 
 | ||||
|     public static final String SP_TIER = "SP_QOSCLASS"; | ||||
| 
 | ||||
|     public static final String OBJECT_DOES_NOT_EXIST = "objectDoesNotExist"; | ||||
| 
 | ||||
|     public static enum StorpoolRights { | ||||
|         RO("ro"), RW("rw"), DETACH("detach"); | ||||
| 
 | ||||
| @ -458,7 +460,7 @@ public class StorPoolUtil { | ||||
|     } | ||||
| 
 | ||||
|     private static boolean objectExists(SpApiError err) { | ||||
|         if (!err.getName().equals("objectDoesNotExist")) { | ||||
|         if (!err.getName().equals(OBJECT_DOES_NOT_EXIST)) { | ||||
|             throw new CloudRuntimeException(err.getDescr()); | ||||
|         } | ||||
|         return false; | ||||
|  | ||||
| @ -16,10 +16,19 @@ | ||||
| // under the License. | ||||
| package org.apache.cloudstack.storage.snapshot; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import javax.inject.Inject; | ||||
| import com.cloud.exception.InvalidParameterValueException; | ||||
| import com.cloud.hypervisor.kvm.storage.StorPoolStorageAdaptor; | ||||
| import com.cloud.storage.DataStoreRole; | ||||
| import com.cloud.storage.Snapshot; | ||||
| import com.cloud.storage.SnapshotVO; | ||||
| import com.cloud.storage.VolumeVO; | ||||
| import com.cloud.storage.dao.SnapshotDao; | ||||
| import com.cloud.storage.dao.SnapshotDetailsDao; | ||||
| import com.cloud.storage.dao.SnapshotDetailsVO; | ||||
| import com.cloud.storage.dao.SnapshotZoneDao; | ||||
| import com.cloud.storage.dao.VolumeDao; | ||||
| import com.cloud.utils.exception.CloudRuntimeException; | ||||
| import com.cloud.utils.fsm.NoTransitionException; | ||||
| 
 | ||||
| import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; | ||||
| import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; | ||||
| @ -40,23 +49,13 @@ import org.apache.cloudstack.storage.datastore.util.StorPoolUtil; | ||||
| import org.apache.cloudstack.storage.datastore.util.StorPoolUtil.SpApiResponse; | ||||
| import org.apache.cloudstack.storage.datastore.util.StorPoolUtil.SpConnectionDesc; | ||||
| import org.apache.commons.collections.CollectionUtils; | ||||
| import org.apache.logging.log4j.Logger; | ||||
| import org.apache.logging.log4j.LogManager; | ||||
| import org.apache.logging.log4j.Logger; | ||||
| import org.springframework.stereotype.Component; | ||||
| 
 | ||||
| import com.cloud.exception.InvalidParameterValueException; | ||||
| import com.cloud.hypervisor.kvm.storage.StorPoolStorageAdaptor; | ||||
| import com.cloud.storage.DataStoreRole; | ||||
| import com.cloud.storage.Snapshot; | ||||
| import com.cloud.storage.SnapshotVO; | ||||
| import com.cloud.storage.VolumeVO; | ||||
| import com.cloud.storage.dao.SnapshotDao; | ||||
| import com.cloud.storage.dao.SnapshotDetailsDao; | ||||
| import com.cloud.storage.dao.SnapshotDetailsVO; | ||||
| import com.cloud.storage.dao.SnapshotZoneDao; | ||||
| import com.cloud.storage.dao.VolumeDao; | ||||
| import com.cloud.utils.exception.CloudRuntimeException; | ||||
| import com.cloud.utils.fsm.NoTransitionException; | ||||
| import javax.inject.Inject; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| 
 | ||||
| @Component | ||||
| @ -117,10 +116,11 @@ public class StorPoolSnapshotStrategy implements SnapshotStrategy { | ||||
|                 if (resp.getError() != null) { | ||||
|                     final String err = String.format("Failed to clean-up Storpool snapshot %s. Error: %s", name, resp.getError()); | ||||
|                     StorPoolUtil.spLog(err); | ||||
|                     markSnapshotAsDestroyedIfAlreadyRemoved(snapshotId, resp); | ||||
|                     markSnapshotAsDestroyedIfAlreadyRemoved(snapshotId, resp.getError().getName().equals(StorPoolUtil.OBJECT_DOES_NOT_EXIST)); | ||||
|                     throw new CloudRuntimeException(err); | ||||
|                 } else { | ||||
|                     res = deleteSnapshotFromDbIfNeeded(snapshotVO, zoneId); | ||||
|                     markSnapshotAsDestroyedIfAlreadyRemoved(snapshotId,true); | ||||
|                     StorPoolUtil.spLog("StorpoolSnapshotStrategy.deleteSnapshot: executed successfully=%s, snapshot uuid=%s, name=%s", res, snapshotVO.getUuid(), name); | ||||
|                 } | ||||
|             } catch (Exception e) { | ||||
| @ -129,15 +129,23 @@ public class StorPoolSnapshotStrategy implements SnapshotStrategy { | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         List<SnapshotDataStoreVO> snapshots = _snapshotStoreDao.listBySnapshotIdAndState(snapshotId, State.Ready); | ||||
|         if (res || CollectionUtils.isEmpty(snapshots)) { | ||||
|             updateSnapshotToDestroyed(snapshotVO); | ||||
|             return true; | ||||
|         } | ||||
|         return res; | ||||
|     } | ||||
| 
 | ||||
|     private void markSnapshotAsDestroyedIfAlreadyRemoved(Long snapshotId, SpApiResponse resp) { | ||||
|         if (resp.getError().getName().equals("objectDoesNotExist")) { | ||||
|             SnapshotDataStoreVO snapshotOnPrimary = _snapshotStoreDao.findBySourceSnapshot(snapshotId, DataStoreRole.Primary); | ||||
|             if (snapshotOnPrimary != null) { | ||||
|                 snapshotOnPrimary.setState(State.Destroyed); | ||||
|                 _snapshotStoreDao.update(snapshotOnPrimary.getId(), snapshotOnPrimary); | ||||
|     private void markSnapshotAsDestroyedIfAlreadyRemoved(Long snapshotId, boolean isSnapshotDeleted) { | ||||
|         if (!isSnapshotDeleted) { | ||||
|             return; | ||||
|         } | ||||
|         List<SnapshotDataStoreVO> snapshotsOnStore = _snapshotStoreDao.listBySnapshotIdAndState(snapshotId, State.Ready); | ||||
|         for (SnapshotDataStoreVO snapshot : snapshotsOnStore) { | ||||
|             if (snapshot.getInstallPath() != null && snapshot.getInstallPath().contains(StorPoolUtil.SP_DEV_PATH)) { | ||||
|                 snapshot.setState(State.Destroyed); | ||||
|                 _snapshotStoreDao.update(snapshot.getId(), snapshot); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user