Skip to content

Commit 2a1db67

Browse files
hsato03Henrique SatoGutoVeronezi
authored
Improve logs in primary storage removal process (#8649)
* Improve delete storage pool logs * Address Daniel's reviews Co-authored-by: Daniel Augusto Veronezi Salvador <38945620+GutoVeronezi@users.noreply.github.com> * Address Daniel's review --------- Co-authored-by: Henrique Sato <henrique.sato@scclouds.com.br> Co-authored-by: Daniel Augusto Veronezi Salvador <38945620+GutoVeronezi@users.noreply.github.com>
1 parent e6cb7f2 commit 2a1db67

File tree

2 files changed

+54
-6
lines changed

2 files changed

+54
-6
lines changed

server/src/main/java/com/cloud/storage/StorageManagerImpl.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1411,7 +1411,8 @@ public void doInTransactionWithoutResult(TransactionStatus status) {
14111411
}
14121412
});
14131413
} else {
1414-
throw new CloudRuntimeException("Cannot delete pool " + sPool.getName() + " as there are associated " + "non-destroyed vols for this pool");
1414+
logger.debug("Cannot delete storage pool {} as the following non-destroyed volumes are on it: {}.", sPool::getName, () -> getStoragePoolNonDestroyedVolumesLog(sPool.getId()));
1415+
throw new CloudRuntimeException(String.format("Cannot delete pool %s as there are non-destroyed volumes associated to this pool.", sPool.getName()));
14151416
}
14161417
}
14171418
return deleteDataStoreInternal(sPool, forced);
@@ -1472,17 +1473,16 @@ private boolean deleteDataStoreInternal(StoragePoolVO sPool, boolean forced) {
14721473
if (vlms.first() > 0) {
14731474
Pair<Long, Long> nonDstrdVlms = volumeDao.getNonDestroyedCountAndTotalByPool(sPool.getId());
14741475
if (nonDstrdVlms.first() > 0) {
1475-
throw new CloudRuntimeException("Cannot delete pool " + sPool.getName() + " as there are associated " + "non-destroyed vols for this pool");
1476+
logger.debug("Cannot delete storage pool {} as the following non-destroyed volumes are on it: {}.", sPool::getName, () -> getStoragePoolNonDestroyedVolumesLog(sPool.getId()));
1477+
throw new CloudRuntimeException(String.format("Cannot delete pool %s as there are non-destroyed volumes associated to this pool.", sPool.getName()));
14761478
}
14771479
// force expunge non-destroyed volumes
14781480
List<VolumeVO> vols = volumeDao.listVolumesToBeDestroyed();
14791481
for (VolumeVO vol : vols) {
14801482
AsyncCallFuture<VolumeApiResult> future = volService.expungeVolumeAsync(volFactory.getVolume(vol.getId()));
14811483
try {
14821484
future.get();
1483-
} catch (InterruptedException e) {
1484-
logger.debug("expunge volume failed:" + vol.getId(), e);
1485-
} catch (ExecutionException e) {
1485+
} catch (InterruptedException | ExecutionException e) {
14861486
logger.debug("expunge volume failed:" + vol.getId(), e);
14871487
}
14881488
}
@@ -1491,7 +1491,8 @@ private boolean deleteDataStoreInternal(StoragePoolVO sPool, boolean forced) {
14911491
// Check if the pool has associated volumes in the volumes table
14921492
// If it does , then you cannot delete the pool
14931493
if (vlms.first() > 0) {
1494-
throw new CloudRuntimeException("Cannot delete pool " + sPool.getName() + " as there are associated volumes for this pool");
1494+
logger.debug("Cannot delete storage pool {} as the following non-destroyed volumes are on it: {}.", sPool::getName, () -> getStoragePoolNonDestroyedVolumesLog(sPool.getId()));
1495+
throw new CloudRuntimeException(String.format("Cannot delete pool %s as there are non-destroyed volumes associated to this pool.", sPool.getName()));
14951496
}
14961497
}
14971498

@@ -1514,6 +1515,23 @@ private boolean deleteDataStoreInternal(StoragePoolVO sPool, boolean forced) {
15141515
return lifeCycle.deleteDataStore(store);
15151516
}
15161517

1518+
protected String getStoragePoolNonDestroyedVolumesLog(long storagePoolId) {
1519+
StringBuilder sb = new StringBuilder();
1520+
List<VolumeVO> nonDestroyedVols = volumeDao.findByPoolId(storagePoolId, null).stream().filter(vol -> vol.getState() != Volume.State.Destroy).collect(Collectors.toList());
1521+
VMInstanceVO volInstance;
1522+
List<String> logMessageInfo = new ArrayList<>();
1523+
1524+
sb.append("[");
1525+
for (VolumeVO vol : nonDestroyedVols) {
1526+
volInstance = _vmInstanceDao.findById(vol.getInstanceId());
1527+
logMessageInfo.add(String.format("Volume [%s] (attached to VM [%s])", vol.getUuid(), volInstance.getUuid()));
1528+
}
1529+
sb.append(String.join(", ", logMessageInfo));
1530+
sb.append("]");
1531+
1532+
return sb.toString();
1533+
}
1534+
15171535
@Override
15181536
public boolean connectHostToSharedPool(long hostId, long poolId) throws StorageUnavailableException, StorageConflictException {
15191537
StoragePool pool = (StoragePool)_dataStoreMgr.getDataStore(poolId, DataStoreRole.Primary);

server/src/test/java/com/cloud/storage/StorageManagerImplTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,18 @@ public class StorageManagerImplTest {
110110
@InjectMocks
111111
private StorageManagerImpl storageManagerImpl;
112112

113+
@Mock
114+
private StoragePoolVO storagePoolVOMock;
115+
116+
@Mock
117+
private VolumeVO volume1VOMock;
118+
119+
@Mock
120+
private VolumeVO volume2VOMock;
121+
122+
@Mock
123+
private VMInstanceVO vmInstanceVOMock;
124+
113125
@Test
114126
public void createLocalStoragePoolName() {
115127
String hostMockName = "host1";
@@ -515,6 +527,24 @@ public void testEnableDefaultDatastoreDownloadRedirectionForExistingInstallation
515527
.update(StorageManager.DataStoreDownloadFollowRedirects.key(),StorageManager.DataStoreDownloadFollowRedirects.defaultValue());
516528
}
517529

530+
@Test
531+
public void getStoragePoolNonDestroyedVolumesLogTestNonDestroyedVolumesReturnLog() {
532+
Mockito.doReturn(1L).when(storagePoolVOMock).getId();
533+
Mockito.doReturn(1L).when(volume1VOMock).getInstanceId();
534+
Mockito.doReturn("786633d1-a942-4374-9d56-322dd4b0d202").when(volume1VOMock).getUuid();
535+
Mockito.doReturn(1L).when(volume2VOMock).getInstanceId();
536+
Mockito.doReturn("ffb46333-e983-4c21-b5f0-51c5877a3805").when(volume2VOMock).getUuid();
537+
Mockito.doReturn("58760044-928f-4c4e-9fef-d0e48423595e").when(vmInstanceVOMock).getUuid();
538+
539+
Mockito.when(_volumeDao.findByPoolId(storagePoolVOMock.getId(), null)).thenReturn(List.of(volume1VOMock, volume2VOMock));
540+
Mockito.doReturn(vmInstanceVOMock).when(vmInstanceDao).findById(Mockito.anyLong());
541+
542+
String log = storageManagerImpl.getStoragePoolNonDestroyedVolumesLog(storagePoolVOMock.getId());
543+
String expected = String.format("[Volume [%s] (attached to VM [%s]), Volume [%s] (attached to VM [%s])]", volume1VOMock.getUuid(), vmInstanceVOMock.getUuid(), volume2VOMock.getUuid(), vmInstanceVOMock.getUuid());
544+
545+
Assert.assertEquals(expected, log);
546+
}
547+
518548
private ChangeStoragePoolScopeCmd mockChangeStoragePooolScopeCmd(String newScope) {
519549
ChangeStoragePoolScopeCmd cmd = new ChangeStoragePoolScopeCmd();
520550
ReflectionTestUtils.setField(cmd, "id", 1L);

0 commit comments

Comments
 (0)