From ea7d3b34d12f636659386cb0e8a58d7272c5fa91 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Mon, 9 Aug 2021 14:21:07 +0530 Subject: [PATCH] Cleanup volume information from db when deleted (#4551) * Cleanup volume information from db when deleted * reuse search builder * revert change Co-authored-by: Pearl Dsilva --- .../datastore/db/VolumeDataStoreDao.java | 2 ++ .../motion/AncientDataMotionStrategy.java | 20 ++++++++++++++++--- .../image/db/VolumeDataStoreDaoImpl.java | 12 ++++++++--- .../com/cloud/storage/StorageManagerImpl.java | 1 + 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java index 0e4e380c753..b3b2ece9043 100644 --- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java +++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java @@ -55,4 +55,6 @@ public interface VolumeDataStoreDao extends GenericDao, boolean updateVolumeId(long srcVolId, long destVolId); List listVolumeDownloadUrlsByZoneId(long zoneId); + + List listByVolume(long volumeId, long storeId); } diff --git a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java index e9c6fc11172..51e0c97a21e 100644 --- a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java +++ b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java @@ -19,6 +19,7 @@ package org.apache.cloudstack.storage.motion; import java.util.HashMap; +import java.util.List; import java.util.Map; import javax.inject.Inject; @@ -44,6 +45,8 @@ import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.storage.RemoteHostEndPoint; import org.apache.cloudstack.storage.command.CopyCommand; +import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO; import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity; import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; import org.apache.log4j.Logger; @@ -85,6 +88,8 @@ public class AncientDataMotionStrategy implements DataMotionStrategy { DataStoreManager dataStoreMgr; @Inject StorageCacheManager cacheMgr; + @Inject + VolumeDataStoreDao volumeDataStoreDao; @Inject StorageManager storageManager; @@ -324,6 +329,15 @@ public class AncientDataMotionStrategy implements DataMotionStrategy { } } + private void deleteVolumeOnSecondaryStore(DataObject objectInStore) { + ImageStoreEntity store = (ImageStoreEntity) objectInStore.getDataStore(); + store.delete(objectInStore); + List volumesOnStore = volumeDataStoreDao.listByVolume(objectInStore.getId(), store.getId()); + for (VolumeDataStoreVO volume : volumesOnStore) { + volumeDataStoreDao.remove(volume.getId()); + } + } + protected Answer copyVolumeBetweenPools(DataObject srcData, DataObject destData) { String value = configDao.getValue(Config.CopyVolumeWait.key()); int _copyvolumewait = NumbersUtil.parseInt(value, Integer.parseInt(Config.CopyVolumeWait.getDefaultValue())); @@ -359,10 +373,9 @@ public class AncientDataMotionStrategy implements DataMotionStrategy { } DataObject objOnImageStore = imageStore.create(srcData); - objOnImageStore.processEvent(Event.CreateOnlyRequested); - Answer answer = null; try { + objOnImageStore.processEvent(Event.CreateOnlyRequested); answer = copyObject(srcData, objOnImageStore); if (answer == null || !answer.getResult()) { @@ -401,11 +414,12 @@ public class AncientDataMotionStrategy implements DataMotionStrategy { objOnImageStore.processEvent(Event.OperationFailed); imageStore.delete(objOnImageStore); } + s_logger.error("Failed to perform operation: "+ e.getLocalizedMessage()); throw e; } objOnImageStore.processEvent(Event.OperationSuccessed); - imageStore.delete(objOnImageStore); + deleteVolumeOnSecondaryStore(objOnImageStore); return answer; } else { DataObject cacheData = cacheMgr.createCacheObject(srcData, destScope); diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java index 34854d5d598..dca2e9a862e 100644 --- a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java +++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java @@ -62,7 +62,6 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase uploadVolumeStateSearch; private static final String EXPIRE_DOWNLOAD_URLS_FOR_ZONE = "update volume_store_ref set download_url_created=? where download_url_created is not null and store_id in (select id from image_store where data_center_id=?)"; - @Inject DataStoreManager storeMgr; @Inject @@ -119,7 +118,6 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase listByVolume(long volumeId, long storeId) { + SearchCriteria sc = storeVolumeSearch.create(); + sc.setParameters("store_id", storeId); + sc.setParameters("volume_id", volumeId); + sc.setParameters("destroyed", false); + return listBy(sc); + } + @Override public List listUploadedVolumesByStoreId(long id) { SearchCriteria sc = uploadVolumeSearch.create(); @@ -340,7 +347,6 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase destroyedStoreVOs = _volumeStoreDao.listDestroyed(store.getId()); + destroyedStoreVOs.addAll(_volumeDataStoreDao.listByVolumeState(Volume.State.Expunged)); s_logger.debug("Secondary storage garbage collector found " + destroyedStoreVOs.size() + " volumes to cleanup on volume_store_ref for store: " + store.getName()); for (VolumeDataStoreVO destroyedStoreVO : destroyedStoreVOs) { if (s_logger.isDebugEnabled()) {