Skip to content

Commit 2fd5ff8

Browse files
rp-dhslove
authored andcommitted
linstor: implement missing deleteDatastore (apache#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 14b4f9e commit 2fd5ff8

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
@@ -23,8 +23,13 @@
2323
import javax.inject.Inject;
2424

2525
import com.cloud.dc.dao.DataCenterDao;
26+
import com.cloud.storage.VMTemplateStoragePoolVO;
27+
import com.cloud.storage.VMTemplateStorageResourceAssoc;
28+
import com.cloud.template.TemplateManager;
2629
import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
2730
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
31+
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
32+
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
2833
import org.apache.cloudstack.storage.volume.datastore.PrimaryDataStoreHelper;
2934

3035
import com.cloud.agent.AgentManager;
@@ -59,6 +64,10 @@ public class BasePrimaryDataStoreLifeCycleImpl {
5964
protected DataCenterDao zoneDao;
6065
@Inject
6166
protected StoragePoolHostDao storagePoolHostDao;
67+
@Inject
68+
private PrimaryDataStoreDao primaryDataStoreDao;
69+
@Inject
70+
private TemplateManager templateMgr;
6271

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

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
@@ -286,7 +286,10 @@ public boolean cancelMaintain(DataStore store) {
286286

287287
@Override
288288
public boolean deleteDataStore(DataStore store) {
289-
return dataStoreHelper.deletePrimaryDataStore(store);
289+
if (cleanupDatastore(store)) {
290+
return dataStoreHelper.deletePrimaryDataStore(store);
291+
}
292+
return false;
290293
}
291294

292295
/* (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
@@ -48,8 +48,6 @@
4848
import org.apache.commons.collections.CollectionUtils;
4949

5050
import com.cloud.agent.AgentManager;
51-
import com.cloud.agent.api.Answer;
52-
import com.cloud.agent.api.DeleteStoragePoolCommand;
5351
import com.cloud.agent.api.StoragePoolInfo;
5452
import com.cloud.capacity.CapacityManager;
5553
import com.cloud.dc.ClusterVO;
@@ -63,9 +61,6 @@
6361
import com.cloud.storage.StorageManager;
6462
import com.cloud.storage.StoragePool;
6563
import com.cloud.storage.StoragePoolAutomation;
66-
import com.cloud.storage.StoragePoolHostVO;
67-
import com.cloud.storage.VMTemplateStoragePoolVO;
68-
import com.cloud.storage.VMTemplateStorageResourceAssoc;
6964
import com.cloud.storage.dao.StoragePoolHostDao;
7065
import com.cloud.template.TemplateManager;
7166
import com.cloud.utils.UriUtils;
@@ -321,37 +316,11 @@ public void disableStoragePool(DataStore dataStore) {
321316

322317
@Override
323318
public boolean deleteDataStore(DataStore dataStore) {
324-
StoragePool storagePool = (StoragePool)dataStore;
325-
StoragePoolVO storagePoolVO = primaryDataStoreDao.findById(storagePool.getId());
326-
if (storagePoolVO == null) {
327-
return false;
328-
}
329-
330-
List<VMTemplateStoragePoolVO> unusedTemplatesInPool = templateMgr.getUnusedTemplatesInPool(storagePoolVO);
331-
for (VMTemplateStoragePoolVO templatePoolVO : unusedTemplatesInPool) {
332-
if (templatePoolVO.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) {
333-
templateMgr.evictTemplateFromStoragePool(templatePoolVO);
334-
}
319+
if (cleanupDatastore(dataStore)) {
320+
ScaleIOGatewayClientConnectionPool.getInstance().removeClient(dataStore.getId());
321+
return dataStoreHelper.deletePrimaryDataStore(dataStore);
335322
}
336-
337-
List<StoragePoolHostVO> poolHostVOs = storagePoolHostDao.listByPoolId(dataStore.getId());
338-
for (StoragePoolHostVO poolHostVO : poolHostVOs) {
339-
DeleteStoragePoolCommand deleteStoragePoolCommand = new DeleteStoragePoolCommand(storagePool);
340-
final Answer answer = agentMgr.easySend(poolHostVO.getHostId(), deleteStoragePoolCommand);
341-
if (answer != null && answer.getResult()) {
342-
logger.info("Successfully deleted storage pool: {} from host: {}", storagePool, poolHostVO.getHostId());
343-
} else {
344-
if (answer != null) {
345-
logger.error("Failed to delete storage pool: {} from host: {} , result: {}", storagePool, poolHostVO.getHostId(), answer.getResult());
346-
} else {
347-
logger.error("Failed to delete storage pool: {} from host: {}", storagePool, poolHostVO.getHostId());
348-
}
349-
}
350-
}
351-
352-
ScaleIOGatewayClientConnectionPool.getInstance().removeClient(dataStore);
353-
354-
return dataStoreHelper.deletePrimaryDataStore(dataStore);
323+
return false;
355324
}
356325

357326
@Override

0 commit comments

Comments
 (0)