From 7932f63390f7b4eef953bea0c6c878e3bc8b3034 Mon Sep 17 00:00:00 2001 From: Harikrishna Patnala Date: Tue, 28 Jul 2020 22:21:20 +0530 Subject: [PATCH] Add checks before actual deletion of datastore cluster --- .../com/cloud/storage/StorageManagerImpl.java | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java index 2381e8eec26..0271e428c9b 100644 --- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java @@ -927,13 +927,44 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C if (sPool.getPoolType() == StoragePoolType.DatastoreCluster) { // FR41 yet to handle on failure of deletion of any of the child storage pool - List childStoragePools = _storagePoolDao.listChildStoragePoolsInDatastoreCluster(sPool.getId()); - for (StoragePoolVO childPool : childStoragePools) { - deleteDataStoreInternal(childPool, forced); + if (checkIfDataStoreClusterCanbeDeleted(sPool, forced)) { + Transaction.execute(new TransactionCallbackNoReturn() { + @Override + public void doInTransactionWithoutResult(TransactionStatus status) { + List childStoragePools = _storagePoolDao.listChildStoragePoolsInDatastoreCluster(sPool.getId()); + for (StoragePoolVO childPool : childStoragePools) { + deleteDataStoreInternal(childPool, forced); + } + } + }); + } else { + throw new CloudRuntimeException("Cannot delete pool " + sPool.getName() + " as there are associated " + "non-destroyed vols for this pool"); } } return deleteDataStoreInternal(sPool, forced); + } + private boolean checkIfDataStoreClusterCanbeDeleted(StoragePoolVO sPool, boolean forced) { + List childStoragePools = _storagePoolDao.listChildStoragePoolsInDatastoreCluster(sPool.getId()); + boolean canDelete = true; + for (StoragePoolVO childPool : childStoragePools) { + Pair vlms = _volsDao.getCountAndTotalByPool(childPool.getId()); + if (forced) { + if (vlms.first() > 0) { + Pair nonDstrdVlms = _volsDao.getNonDestroyedCountAndTotalByPool(childPool.getId()); + if (nonDstrdVlms.first() > 0) { + canDelete = false; + break; + } + } + } else { + if (vlms.first() > 0) { + canDelete = false; + break; + } + } + } + return canDelete; } private boolean deleteDataStoreInternal(StoragePoolVO sPool, boolean forced) {