Skip to content

Commit f4a7c8a

Browse files
authored
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.
1 parent 7978141 commit f4a7c8a

File tree

4 files changed

+61
-36
lines changed

4 files changed

+61
-36
lines changed

engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/BasePrimaryDataStoreLifeCycleImpl.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,13 @@
2222

2323
import javax.inject.Inject;
2424

25+
import com.cloud.storage.VMTemplateStoragePoolVO;
26+
import com.cloud.storage.VMTemplateStorageResourceAssoc;
27+
import com.cloud.template.TemplateManager;
2528
import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
2629
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
30+
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
31+
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
2732
import org.apache.cloudstack.storage.volume.datastore.PrimaryDataStoreHelper;
2833
import org.apache.log4j.Logger;
2934

@@ -54,6 +59,10 @@ public class BasePrimaryDataStoreLifeCycleImpl {
5459
protected HostDao hostDao;
5560
@Inject
5661
protected StoragePoolHostDao storagePoolHostDao;
62+
@Inject
63+
private PrimaryDataStoreDao primaryDataStoreDao;
64+
@Inject
65+
private TemplateManager templateMgr;
5766

5867
private List<HostVO> getPoolHostsList(ClusterScope clusterScope, HypervisorType hypervisorType) {
5968
List<HostVO> hosts;
@@ -103,4 +112,42 @@ public void changeStoragePoolScopeToCluster(DataStore store, ClusterScope cluste
103112
}
104113
dataStoreHelper.switchToCluster(store, clusterScope);
105114
}
115+
116+
private void evictTemplates(StoragePoolVO storagePoolVO) {
117+
List<VMTemplateStoragePoolVO> unusedTemplatesInPool = templateMgr.getUnusedTemplatesInPool(storagePoolVO);
118+
for (VMTemplateStoragePoolVO templatePoolVO : unusedTemplatesInPool) {
119+
if (templatePoolVO.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) {
120+
templateMgr.evictTemplateFromStoragePool(templatePoolVO);
121+
}
122+
}
123+
}
124+
125+
private void deleteAgentStoragePools(StoragePool storagePool) {
126+
List<StoragePoolHostVO> poolHostVOs = storagePoolHostDao.listByPoolId(storagePool.getId());
127+
for (StoragePoolHostVO poolHostVO : poolHostVOs) {
128+
DeleteStoragePoolCommand deleteStoragePoolCommand = new DeleteStoragePoolCommand(storagePool);
129+
final Answer answer = agentMgr.easySend(poolHostVO.getHostId(), deleteStoragePoolCommand);
130+
if (answer != null && answer.getResult()) {
131+
s_logger.info("Successfully deleted storage pool: " + storagePool.getId() + " from host: " + poolHostVO.getHostId());
132+
} else {
133+
if (answer != null) {
134+
s_logger.error("Failed to delete storage pool: " + storagePool.getId() + " from host: " + poolHostVO.getHostId() + " , result: " + answer.getResult());
135+
} else {
136+
s_logger.error("Failed to delete storage pool: " + storagePool.getId() + " from host: " + poolHostVO.getHostId());
137+
}
138+
}
139+
}
140+
}
141+
142+
protected boolean cleanupDatastore(DataStore store) {
143+
StoragePool storagePool = (StoragePool)store;
144+
StoragePoolVO storagePoolVO = primaryDataStoreDao.findById(storagePool.getId());
145+
if (storagePoolVO == null) {
146+
return false;
147+
}
148+
149+
evictTemplates(storagePoolVO);
150+
deleteAgentStoragePools(storagePool);
151+
return true;
152+
}
106153
}

plugins/storage/volume/linstor/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ All notable changes to Linstor CloudStack plugin will be documented in this file
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [2025-03-13]
9+
10+
### Fixed
11+
12+
- Implemented missing delete datastore, to correctly cleanup on datastore removal
13+
814
## [2025-02-21]
915

1016
### Fixed

plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/LinstorPrimaryDataStoreLifeCycleImpl.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,10 @@ public boolean cancelMaintain(DataStore store) {
289289

290290
@Override
291291
public boolean deleteDataStore(DataStore store) {
292-
return dataStoreHelper.deletePrimaryDataStore(store);
292+
if (cleanupDatastore(store)) {
293+
return dataStoreHelper.deletePrimaryDataStore(store);
294+
}
295+
return false;
293296
}
294297

295298
/* (non-Javadoc)

plugins/storage/volume/scaleio/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/ScaleIOPrimaryDataStoreLifeCycle.java

Lines changed: 4 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,6 @@
5050
import org.apache.log4j.Logger;
5151

5252
import com.cloud.agent.AgentManager;
53-
import com.cloud.agent.api.Answer;
54-
import com.cloud.agent.api.DeleteStoragePoolCommand;
5553
import com.cloud.agent.api.StoragePoolInfo;
5654
import com.cloud.capacity.CapacityManager;
5755
import com.cloud.dc.ClusterVO;
@@ -65,9 +63,6 @@
6563
import com.cloud.storage.StorageManager;
6664
import com.cloud.storage.StoragePool;
6765
import com.cloud.storage.StoragePoolAutomation;
68-
import com.cloud.storage.StoragePoolHostVO;
69-
import com.cloud.storage.VMTemplateStoragePoolVO;
70-
import com.cloud.storage.VMTemplateStorageResourceAssoc;
7166
import com.cloud.storage.dao.StoragePoolHostDao;
7267
import com.cloud.template.TemplateManager;
7368
import com.cloud.utils.UriUtils;
@@ -345,37 +340,11 @@ public void disableStoragePool(DataStore dataStore) {
345340

346341
@Override
347342
public boolean deleteDataStore(DataStore dataStore) {
348-
StoragePool storagePool = (StoragePool)dataStore;
349-
StoragePoolVO storagePoolVO = primaryDataStoreDao.findById(storagePool.getId());
350-
if (storagePoolVO == null) {
351-
return false;
352-
}
353-
354-
List<VMTemplateStoragePoolVO> unusedTemplatesInPool = templateMgr.getUnusedTemplatesInPool(storagePoolVO);
355-
for (VMTemplateStoragePoolVO templatePoolVO : unusedTemplatesInPool) {
356-
if (templatePoolVO.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) {
357-
templateMgr.evictTemplateFromStoragePool(templatePoolVO);
358-
}
343+
if (cleanupDatastore(dataStore)) {
344+
ScaleIOGatewayClientConnectionPool.getInstance().removeClient(dataStore.getId());
345+
return dataStoreHelper.deletePrimaryDataStore(dataStore);
359346
}
360-
361-
List<StoragePoolHostVO> poolHostVOs = storagePoolHostDao.listByPoolId(dataStore.getId());
362-
for (StoragePoolHostVO poolHostVO : poolHostVOs) {
363-
DeleteStoragePoolCommand deleteStoragePoolCommand = new DeleteStoragePoolCommand(storagePool);
364-
final Answer answer = agentMgr.easySend(poolHostVO.getHostId(), deleteStoragePoolCommand);
365-
if (answer != null && answer.getResult()) {
366-
LOGGER.info("Successfully deleted storage pool: " + storagePool.getId() + " from host: " + poolHostVO.getHostId());
367-
} else {
368-
if (answer != null) {
369-
LOGGER.error("Failed to delete storage pool: " + storagePool.getId() + " from host: " + poolHostVO.getHostId() + " , result: " + answer.getResult());
370-
} else {
371-
LOGGER.error("Failed to delete storage pool: " + storagePool.getId() + " from host: " + poolHostVO.getHostId());
372-
}
373-
}
374-
}
375-
376-
ScaleIOGatewayClientConnectionPool.getInstance().removeClient(dataStore.getId());
377-
378-
return dataStoreHelper.deletePrimaryDataStore(dataStore);
347+
return false;
379348
}
380349

381350
@Override

0 commit comments

Comments
 (0)