hsato03 commented on code in PR #8031:
URL: https://github.com/apache/cloudstack/pull/8031#discussion_r1353106386


##########
server/src/main/java/com/cloud/storage/StorageManagerImpl.java:
##########
@@ -1289,37 +1289,52 @@ public void cleanupStorage(boolean recurring) {
                             try {
 
                                 List<VMTemplateStoragePoolVO> 
unusedTemplatesInPool = _tmpltMgr.getUnusedTemplatesInPool(pool);
-                                s_logger.debug("Storage pool garbage collector 
found " + unusedTemplatesInPool.size() + " templates to clean up in storage 
pool: " + pool.getName());
+                                s_logger.debug(String.format("Storage pool 
garbage collector found [%s] templates to be cleaned up in storage pool [%s].", 
unusedTemplatesInPool.size(), pool.getName()));
                                 for (VMTemplateStoragePoolVO templatePoolVO : 
unusedTemplatesInPool) {
                                     if (templatePoolVO.getDownloadState() != 
VMTemplateStorageResourceAssoc.Status.DOWNLOADED) {
-                                        s_logger.debug("Storage pool garbage 
collector is skipping template with ID: " + templatePoolVO.getTemplateId() + " 
on pool " + templatePoolVO.getPoolId()
-                                        + " because it is not completely 
downloaded.");
+                                        s_logger.debug(String.format("Storage 
pool garbage collector is skipping template [%s] clean up on pool [%s] " +
+                                                "because it is not completely 
downloaded.", templatePoolVO.getTemplateId(), templatePoolVO.getPoolId()));
                                         continue;
                                     }
 
                                     if (!templatePoolVO.getMarkedForGC()) {
                                         templatePoolVO.setMarkedForGC(true);
                                         
_vmTemplatePoolDao.update(templatePoolVO.getId(), templatePoolVO);
-                                        s_logger.debug("Storage pool garbage 
collector has marked template with ID: " + templatePoolVO.getTemplateId() + " 
on pool " + templatePoolVO.getPoolId()
-                                        + " for garbage collection.");
+                                        s_logger.debug(String.format("Storage 
pool garbage collector has marked template [%s] on pool [%s] " +
+                                                "for garbage collection.", 
templatePoolVO.getTemplateId(), templatePoolVO.getPoolId()));
                                         continue;
                                     }
 
                                     
_tmpltMgr.evictTemplateFromStoragePool(templatePoolVO);
                                 }
                             } catch (Exception e) {
-                                s_logger.warn("Problem cleaning up primary 
storage pool " + pool, e);
+                                s_logger.error(String.format("Failed to clean 
up primary storage pool [%s] due to: [%s].", pool, e.getMessage()), e);
                             }
                         }
                     }
 
                     //destroy snapshots in destroying state in 
snapshot_store_ref
                     List<SnapshotDataStoreVO> ssSnapshots = 
_snapshotStoreDao.listByState(ObjectInDataStoreStateMachine.State.Destroying);
                     for (SnapshotDataStoreVO ssSnapshotVO : ssSnapshots) {
+                        SnapshotVO snapshot = 
_snapshotDao.findById(ssSnapshotVO.getSnapshotId());
+                        if (snapshot == null) {
+                            s_logger.warn(String.format("Did not find snapshot 
[%s] in destroying state; therefore, it cannot be destroyed.", 
ssSnapshotVO.getSnapshotId()));
+                            continue;
+                        }
+
+                        String snapshotUuid = snapshot.getUuid();
                         try {
-                            
_snapshotService.deleteSnapshot(snapshotFactory.getSnapshot(ssSnapshotVO.getSnapshotId(),
 DataStoreRole.Image));
+                            s_logger.debug(String.format("Verifying if 
snapshot [%s] is in destroying state in any image data store.", snapshotUuid));
+                            SnapshotInfo snapshotInfo = 
snapshotFactory.getSnapshot(snapshot.getId(), DataStoreRole.Image);
+
+                            if (snapshotInfo != null) {

Review Comment:
   You are right. But, snapshotInfo is getting only  snapshots from Image data 
store role. If a snapshot is in destroying state in a Primary data store role 
and the same snapshot in the Image data store role has already been cleaned up, 
a NPE will be thrown.
   
   ![Screenshot from 2023-08-09 
16-28-32](https://github.com/apache/cloudstack/assets/39202678/fe723e7a-fe08-4c6f-baab-dbbe13432a12)
   
   Snapshots from ID 18 & 19 were cleaned up in Image data store but the 
snapshot still remains in destroying state in Primary data store.
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@cloudstack.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to