This is an automated email from the ASF dual-hosted git repository.
pearl11594 pushed a commit to branch 4.19
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.19 by this push:
new f4a7c8ab89a linstor: implement missing deleteDatastore (#10561)
f4a7c8ab89a is described below
commit f4a7c8ab89ac04aa70350f643f26c3280ff37c9e
Author: Rene Peinthor <[email protected]>
AuthorDate: Tue Mar 18 13:50:19 2025 +0100
linstor: implement missing deleteDatastore (#10561)
Somehow deleteDatastore was never implemented, that meant:
templates haven't been cleaned up on datastore delete and
also agents have never been informed about storage pool removal.
---
.../BasePrimaryDataStoreLifeCycleImpl.java | 47 ++++++++++++++++++++++
plugins/storage/volume/linstor/CHANGELOG.md | 6 +++
.../LinstorPrimaryDataStoreLifeCycleImpl.java | 5 ++-
.../ScaleIOPrimaryDataStoreLifeCycle.java | 39 ++----------------
4 files changed, 61 insertions(+), 36 deletions(-)
diff --git
a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/BasePrimaryDataStoreLifeCycleImpl.java
b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/BasePrimaryDataStoreLifeCycleImpl.java
index adc74a77d43..021e49155d3 100644
---
a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/BasePrimaryDataStoreLifeCycleImpl.java
+++
b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/BasePrimaryDataStoreLifeCycleImpl.java
@@ -22,8 +22,13 @@ import java.util.List;
import javax.inject.Inject;
+import com.cloud.storage.VMTemplateStoragePoolVO;
+import com.cloud.storage.VMTemplateStorageResourceAssoc;
+import com.cloud.template.TemplateManager;
import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
import org.apache.cloudstack.storage.volume.datastore.PrimaryDataStoreHelper;
import org.apache.log4j.Logger;
@@ -54,6 +59,10 @@ public class BasePrimaryDataStoreLifeCycleImpl {
protected HostDao hostDao;
@Inject
protected StoragePoolHostDao storagePoolHostDao;
+ @Inject
+ private PrimaryDataStoreDao primaryDataStoreDao;
+ @Inject
+ private TemplateManager templateMgr;
private List<HostVO> getPoolHostsList(ClusterScope clusterScope,
HypervisorType hypervisorType) {
List<HostVO> hosts;
@@ -103,4 +112,42 @@ public class BasePrimaryDataStoreLifeCycleImpl {
}
dataStoreHelper.switchToCluster(store, clusterScope);
}
+
+ private void evictTemplates(StoragePoolVO storagePoolVO) {
+ List<VMTemplateStoragePoolVO> unusedTemplatesInPool =
templateMgr.getUnusedTemplatesInPool(storagePoolVO);
+ for (VMTemplateStoragePoolVO templatePoolVO : unusedTemplatesInPool) {
+ if (templatePoolVO.getDownloadState() ==
VMTemplateStorageResourceAssoc.Status.DOWNLOADED) {
+ templateMgr.evictTemplateFromStoragePool(templatePoolVO);
+ }
+ }
+ }
+
+ private void deleteAgentStoragePools(StoragePool storagePool) {
+ List<StoragePoolHostVO> poolHostVOs =
storagePoolHostDao.listByPoolId(storagePool.getId());
+ for (StoragePoolHostVO poolHostVO : poolHostVOs) {
+ DeleteStoragePoolCommand deleteStoragePoolCommand = new
DeleteStoragePoolCommand(storagePool);
+ final Answer answer = agentMgr.easySend(poolHostVO.getHostId(),
deleteStoragePoolCommand);
+ if (answer != null && answer.getResult()) {
+ s_logger.info("Successfully deleted storage pool: " +
storagePool.getId() + " from host: " + poolHostVO.getHostId());
+ } else {
+ if (answer != null) {
+ s_logger.error("Failed to delete storage pool: " +
storagePool.getId() + " from host: " + poolHostVO.getHostId() + " , result: " +
answer.getResult());
+ } else {
+ s_logger.error("Failed to delete storage pool: " +
storagePool.getId() + " from host: " + poolHostVO.getHostId());
+ }
+ }
+ }
+ }
+
+ protected boolean cleanupDatastore(DataStore store) {
+ StoragePool storagePool = (StoragePool)store;
+ StoragePoolVO storagePoolVO =
primaryDataStoreDao.findById(storagePool.getId());
+ if (storagePoolVO == null) {
+ return false;
+ }
+
+ evictTemplates(storagePoolVO);
+ deleteAgentStoragePools(storagePool);
+ return true;
+ }
}
diff --git a/plugins/storage/volume/linstor/CHANGELOG.md
b/plugins/storage/volume/linstor/CHANGELOG.md
index e27e521bcd8..7e9d754b9f6 100644
--- a/plugins/storage/volume/linstor/CHANGELOG.md
+++ b/plugins/storage/volume/linstor/CHANGELOG.md
@@ -5,6 +5,12 @@ All notable changes to Linstor CloudStack plugin will be
documented in this file
The format is based on [Keep a
Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic
Versioning](https://semver.org/spec/v2.0.0.html).
+## [2025-03-13]
+
+### Fixed
+
+- Implemented missing delete datastore, to correctly cleanup on datastore
removal
+
## [2025-02-21]
### Fixed
diff --git
a/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/LinstorPrimaryDataStoreLifeCycleImpl.java
b/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/LinstorPrimaryDataStoreLifeCycleImpl.java
index 0ef97ae4796..cbe7b3f7d81 100644
---
a/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/LinstorPrimaryDataStoreLifeCycleImpl.java
+++
b/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/LinstorPrimaryDataStoreLifeCycleImpl.java
@@ -289,7 +289,10 @@ public class LinstorPrimaryDataStoreLifeCycleImpl extends
BasePrimaryDataStoreLi
@Override
public boolean deleteDataStore(DataStore store) {
- return dataStoreHelper.deletePrimaryDataStore(store);
+ if (cleanupDatastore(store)) {
+ return dataStoreHelper.deletePrimaryDataStore(store);
+ }
+ return false;
}
/* (non-Javadoc)
diff --git
a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/ScaleIOPrimaryDataStoreLifeCycle.java
b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/ScaleIOPrimaryDataStoreLifeCycle.java
index c1a7411d29f..7ddd41fb7b6 100644
---
a/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/ScaleIOPrimaryDataStoreLifeCycle.java
+++
b/plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/ScaleIOPrimaryDataStoreLifeCycle.java
@@ -50,8 +50,6 @@ import
org.apache.cloudstack.storage.volume.datastore.PrimaryDataStoreHelper;
import org.apache.log4j.Logger;
import com.cloud.agent.AgentManager;
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.DeleteStoragePoolCommand;
import com.cloud.agent.api.StoragePoolInfo;
import com.cloud.capacity.CapacityManager;
import com.cloud.dc.ClusterVO;
@@ -65,9 +63,6 @@ import com.cloud.storage.Storage;
import com.cloud.storage.StorageManager;
import com.cloud.storage.StoragePool;
import com.cloud.storage.StoragePoolAutomation;
-import com.cloud.storage.StoragePoolHostVO;
-import com.cloud.storage.VMTemplateStoragePoolVO;
-import com.cloud.storage.VMTemplateStorageResourceAssoc;
import com.cloud.storage.dao.StoragePoolHostDao;
import com.cloud.template.TemplateManager;
import com.cloud.utils.UriUtils;
@@ -345,37 +340,11 @@ public class ScaleIOPrimaryDataStoreLifeCycle extends
BasePrimaryDataStoreLifeCy
@Override
public boolean deleteDataStore(DataStore dataStore) {
- StoragePool storagePool = (StoragePool)dataStore;
- StoragePoolVO storagePoolVO =
primaryDataStoreDao.findById(storagePool.getId());
- if (storagePoolVO == null) {
- return false;
- }
-
- List<VMTemplateStoragePoolVO> unusedTemplatesInPool =
templateMgr.getUnusedTemplatesInPool(storagePoolVO);
- for (VMTemplateStoragePoolVO templatePoolVO : unusedTemplatesInPool) {
- if (templatePoolVO.getDownloadState() ==
VMTemplateStorageResourceAssoc.Status.DOWNLOADED) {
- templateMgr.evictTemplateFromStoragePool(templatePoolVO);
- }
+ if (cleanupDatastore(dataStore)) {
+
ScaleIOGatewayClientConnectionPool.getInstance().removeClient(dataStore.getId());
+ return dataStoreHelper.deletePrimaryDataStore(dataStore);
}
-
- List<StoragePoolHostVO> poolHostVOs =
storagePoolHostDao.listByPoolId(dataStore.getId());
- for (StoragePoolHostVO poolHostVO : poolHostVOs) {
- DeleteStoragePoolCommand deleteStoragePoolCommand = new
DeleteStoragePoolCommand(storagePool);
- final Answer answer = agentMgr.easySend(poolHostVO.getHostId(),
deleteStoragePoolCommand);
- if (answer != null && answer.getResult()) {
- LOGGER.info("Successfully deleted storage pool: " +
storagePool.getId() + " from host: " + poolHostVO.getHostId());
- } else {
- if (answer != null) {
- LOGGER.error("Failed to delete storage pool: " +
storagePool.getId() + " from host: " + poolHostVO.getHostId() + " , result: " +
answer.getResult());
- } else {
- LOGGER.error("Failed to delete storage pool: " +
storagePool.getId() + " from host: " + poolHostVO.getHostId());
- }
- }
- }
-
-
ScaleIOGatewayClientConnectionPool.getInstance().removeClient(dataStore.getId());
-
- return dataStoreHelper.deletePrimaryDataStore(dataStore);
+ return false;
}
@Override