From b774ee5d117ff3d0ffa2ea0e3973c733262b2617 Mon Sep 17 00:00:00 2001 From: Harikrishna Date: Tue, 11 Apr 2023 22:23:12 +0530 Subject: [PATCH] vmware: Datastore cluster synchronization should check if the child datastores are in UP state or not (#7385) This fix ensures when datastore cluster in VMware is added as a primary storage pool in CloudStack then all the child datastores (which already exists in CS) should be in Up state. For example: 1. Datastore Cluster DS has two child datastores A and B in vCenter. (B is already added as a storage pool in CloudStack) 2. Now try to add datastore cluster DS into CloudStack as a primary storage pool 3. CloudStack tries to add child datastores A and B in CloudStack, since B is already there in CloudStack, it will reuse the existing storagepool entry and will keep under parent Storage pool DS. During Step 3 we are now checking if B is Up state or not. --- .../src/main/java/com/cloud/storage/StorageManager.java | 2 ++ .../storage/datastore/provider/DefaultHostListener.java | 1 + .../src/main/java/com/cloud/storage/StorageManagerImpl.java | 6 +++--- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java b/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java index 8437b56f2e0..28e7c89419a 100644 --- a/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java +++ b/engine/components-api/src/main/java/com/cloud/storage/StorageManager.java @@ -356,4 +356,6 @@ public interface StorageManager extends StorageService { void syncDatastoreClusterStoragePool(long datastoreClusterPoolId, List childDatastoreAnswerList, long hostId); + void validateChildDatastoresToBeAddedInUpState(StoragePoolVO datastoreClusterPool, List childDatastoreAnswerList); + } diff --git a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/provider/DefaultHostListener.java b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/provider/DefaultHostListener.java index c3d3cf5c65c..e344a87831d 100644 --- a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/provider/DefaultHostListener.java +++ b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/provider/DefaultHostListener.java @@ -152,6 +152,7 @@ public class DefaultHostListener implements HypervisorHostListener { updateStoragePoolHostVOAndDetails(poolVO, hostId, mspAnswer); if (pool.getPoolType() == Storage.StoragePoolType.DatastoreCluster) { + storageManager.validateChildDatastoresToBeAddedInUpState(poolVO, mspAnswer.getDatastoreClusterChildren()); storageManager.syncDatastoreClusterStoragePool(poolId, ((ModifyStoragePoolAnswer) answer).getDatastoreClusterChildren(), hostId); } diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java index 93a805a9afd..c1d17cc8f70 100644 --- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java @@ -1889,7 +1889,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C return _storagePoolDao.findByUuid(uuid); } - private void validateChildDatastoresToBeAddedInUpState(StoragePoolVO datastoreClusterPool, List childDatastoreAnswerList) { + public void validateChildDatastoresToBeAddedInUpState(StoragePoolVO datastoreClusterPool, List childDatastoreAnswerList) { for (ModifyStoragePoolAnswer childDataStoreAnswer : childDatastoreAnswerList) { StoragePoolInfo childStoragePoolInfo = childDataStoreAnswer.getPoolInfo(); StoragePoolVO dataStoreVO = _storagePoolDao.findPoolByUUID(childStoragePoolInfo.getUuid()); @@ -1904,8 +1904,8 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C } } if (dataStoreVO != null && !dataStoreVO.getStatus().equals(StoragePoolStatus.Up)) { - String msg = String.format("Cannot synchronise datastore cluster %s because primary storage with id %s is not ready for syncing, " + - "as the status is %s", datastoreClusterPool.getUuid(), dataStoreVO.getUuid(), dataStoreVO.getStatus().toString()); + String msg = String.format("Cannot synchronise datastore cluster %s because primary storage with id %s is not in Up state, " + + "current state is %s", datastoreClusterPool.getUuid(), dataStoreVO.getUuid(), dataStoreVO.getStatus().toString()); throw new CloudRuntimeException(msg); } }