You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ah...@apache.org on 2013/07/01 23:24:56 UTC

[12/50] [abbrv] git commit: updated refs/heads/vmsync to f737019

CLOUDSTACK-3145:StorageManager-Scavenger NPEs when cleaning up
templates.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/2c31f38c
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/2c31f38c
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/2c31f38c

Branch: refs/heads/vmsync
Commit: 2c31f38c05c16d661812cb89317eb2d4e6c8faf3
Parents: 1659ee2
Author: Min Chen <mi...@citrix.com>
Authored: Fri Jun 28 15:21:57 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Fri Jun 28 17:54:48 2013 -0700

----------------------------------------------------------------------
 .../com/cloud/storage/StorageManagerImpl.java   | 156 ++++++-------------
 1 file changed, 45 insertions(+), 111 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2c31f38c/server/src/com/cloud/storage/StorageManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java
index 241f6e6..ff323cb 100755
--- a/server/src/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/com/cloud/storage/StorageManagerImpl.java
@@ -42,7 +42,6 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 import org.apache.cloudstack.api.command.admin.storage.AddImageStoreCmd;
-import com.cloud.server.ConfigurationServer;
 import org.apache.cloudstack.api.command.admin.storage.CancelPrimaryStorageMaintenanceCmd;
 import org.apache.cloudstack.api.command.admin.storage.CreateCacheStoreCmd;
 import org.apache.cloudstack.api.command.admin.storage.CreateStoragePoolCmd;
@@ -55,25 +54,21 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManager;
-import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
 import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
 import org.apache.cloudstack.engine.subsystem.api.storage.HostScope;
 import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener;
-import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
-import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory;
 import org.apache.cloudstack.engine.subsystem.api.storage.ImageStoreProvider;
 import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
-import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory;
 import org.apache.cloudstack.engine.subsystem.api.storage.TemplateService;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
-import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService.VolumeApiResult;
 import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
 import org.apache.cloudstack.framework.async.AsyncCallFuture;
-import org.apache.cloudstack.storage.command.DeleteCommand;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
@@ -132,9 +127,9 @@ import com.cloud.hypervisor.HypervisorGuruManager;
 import com.cloud.org.Grouping;
 import com.cloud.org.Grouping.AllocationState;
 import com.cloud.resource.ResourceState;
+import com.cloud.server.ConfigurationServer;
 import com.cloud.server.ManagementServer;
 import com.cloud.server.StatsCollector;
-import com.cloud.service.dao.ServiceOfferingDao;
 import com.cloud.service.ServiceOfferingVO;
 import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.storage.Storage.StoragePoolType;
@@ -146,9 +141,6 @@ import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.storage.dao.VMTemplatePoolDao;
 import com.cloud.storage.dao.VMTemplateZoneDao;
 import com.cloud.storage.dao.VolumeDao;
-import com.cloud.storage.dao.VolumeHostDao;
-import com.cloud.storage.DiskOfferingVO;
-import com.cloud.storage.download.DownloadMonitor;
 import com.cloud.storage.listener.StoragePoolMonitor;
 import com.cloud.storage.listener.VolumeStateListener;
 import com.cloud.template.TemplateManager;
@@ -631,7 +623,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
 
                 store = lifeCycle.initialize(params);
             } else {
-                store = (DataStore) dataStoreMgr.getDataStore(pool.getId(), DataStoreRole.Primary);
+                store = dataStoreMgr.getDataStore(pool.getId(), DataStoreRole.Primary);
             }
 
             HostScope scope = new HostScope(host.getId(), host.getDataCenterId());
@@ -641,13 +633,13 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
             throw new ConnectionException(true, "Unable to setup the local storage pool for " + host, e);
         }
 
-        return (DataStore) dataStoreMgr.getDataStore(store.getId(), DataStoreRole.Primary);
+        return dataStoreMgr.getDataStore(store.getId(), DataStoreRole.Primary);
     }
 
     @Override
     @SuppressWarnings("rawtypes")
     public PrimaryDataStoreInfo createPool(CreateStoragePoolCmd cmd) throws ResourceInUseException, IllegalArgumentException, UnknownHostException,
-            ResourceUnavailableException {
+    ResourceUnavailableException {
         String providerName = cmd.getStorageProviderName();
         DataStoreProvider storeProvider = dataStoreProviderMgr.getDataStoreProvider(providerName);
 
@@ -695,7 +687,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
                         "Missing parameter hypervisor. Hypervisor type is required to create zone wide primary storage.");
             }
             if (hypervisorType != HypervisorType.KVM && hypervisorType != HypervisorType.VMware &&
-                hypervisorType != HypervisorType.Any) {
+                    hypervisorType != HypervisorType.Any) {
                 throw new InvalidParameterValueException(
                         "zone wide storage pool is not supported for hypervisor type " + hypervisor);
             }
@@ -883,16 +875,16 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
         if (storagePool.getPoolType() == StoragePoolType.NetworkFilesystem) {
             BigDecimal overProvFactor = getStorageOverProvisioningFactor(storagePool.getDataCenterId());
             totalOverProvCapacity = overProvFactor.multiply(new BigDecimal(storagePool.getCapacityBytes())).longValue();// All
-                                                                                                                        // this
-                                                                                                                        // for
-                                                                                                                        // the
-                                                                                                                        // inaccuracy
-                                                                                                                        // of
-                                                                                                                        // floats
-                                                                                                                        // for
-                                                                                                                        // big
-                                                                                                                        // number
-                                                                                                                        // multiplication.
+            // this
+            // for
+            // the
+            // inaccuracy
+            // of
+            // floats
+            // for
+            // big
+            // number
+            // multiplication.
         } else {
             totalOverProvCapacity = storagePool.getCapacityBytes();
         }
@@ -1103,63 +1095,34 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
     @Override
     @DB
     public void cleanupSecondaryStorage(boolean recurring) {
+        // NOTE that object_store refactor will immediately delete the object from secondary storage when deleteTemplate etc api is issued.
+        // so here we don't need to issue DeleteCommand to resource anymore, only need to remove db entry.
         try {
-            // Cleanup templates in secondary storage hosts
+            // Cleanup templates in template_store_ref
             List<DataStore> imageStores = this.dataStoreMgr.getImageStoresByScope(new ZoneScope(null));
             for (DataStore store : imageStores) {
                 try {
                     long storeId = store.getId();
                     List<TemplateDataStoreVO> destroyedTemplateStoreVOs = this._templateStoreDao.listDestroyed(storeId);
                     s_logger.debug("Secondary storage garbage collector found " + destroyedTemplateStoreVOs.size()
-                            + " templates to cleanup on secondary storage host: " + store.getName());
+                            + " templates to cleanup on template_store_ref for store: " + store.getName());
                     for (TemplateDataStoreVO destroyedTemplateStoreVO : destroyedTemplateStoreVOs) {
-                        if (!_tmpltMgr.templateIsDeleteable(destroyedTemplateStoreVO.getTemplateId())) {
-                            if (s_logger.isDebugEnabled()) {
-                                s_logger.debug("Not deleting template at: " + destroyedTemplateStoreVO);
-                            }
-                            continue;
-                        }
-
                         if (s_logger.isDebugEnabled()) {
-                            s_logger.debug("Deleting template store: " + destroyedTemplateStoreVO);
-                        }
-
-                        VMTemplateVO destroyedTemplate = this._vmTemplateDao.findById(destroyedTemplateStoreVO.getTemplateId());
-                        if (destroyedTemplate == null) {
-                            s_logger.error("Cannot find template : " + destroyedTemplateStoreVO.getTemplateId() + " from template table");
-                            throw new CloudRuntimeException("Template " + destroyedTemplateStoreVO.getTemplateId()
-                                    + " is found in secondary storage, but not found in template table");
-                        }
-                        String installPath = destroyedTemplateStoreVO.getInstallPath();
-
-                        TemplateInfo tmpl = tmplFactory.getTemplate(destroyedTemplateStoreVO.getTemplateId(), store);
-                        if (installPath != null) {
-                            EndPoint ep = _epSelector.select(store);
-                            Command cmd = new DeleteCommand(tmpl.getTO());
-                            Answer answer = ep.sendMessage(cmd);
-
-                            if (answer == null || !answer.getResult()) {
-                                s_logger.debug("Failed to delete " + destroyedTemplateStoreVO + " due to "
-                                        + ((answer == null) ? "answer is null" : answer.getDetails()));
-                            } else {
-                                _templateStoreDao.remove(destroyedTemplateStoreVO.getId());
-                                s_logger.debug("Deleted template at: " + destroyedTemplateStoreVO.getInstallPath());
-                            }
-                        } else {
-                            _templateStoreDao.remove(destroyedTemplateStoreVO.getId());
+                            s_logger.debug("Deleting template store DB entry: " + destroyedTemplateStoreVO);
                         }
+                        _templateStoreDao.remove(destroyedTemplateStoreVO.getId());
                     }
                 } catch (Exception e) {
-                    s_logger.warn("problem cleaning up templates in secondary storage store " + store.getName(), e);
+                    s_logger.warn("problem cleaning up templates in template_store_ref for store: " + store.getName(), e);
                 }
             }
 
-            // CleanUp snapshots on Secondary Storage.
+            // CleanUp snapshots on snapshot_store_ref
             for (DataStore store : imageStores) {
                 try {
                     List<SnapshotDataStoreVO> destroyedSnapshotStoreVOs = _snapshotStoreDao.listDestroyed(store.getId());
                     s_logger.debug("Secondary storage garbage collector found " + destroyedSnapshotStoreVOs.size()
-                            + " snapshots to cleanup on secondary storage host: " + store.getName());
+                            + " snapshots to cleanup on snapshot_store_ref for store: " + store.getName());
                     for (SnapshotDataStoreVO destroyedSnapshotStoreVO : destroyedSnapshotStoreVOs) {
                         // check if this snapshot has child
                         SnapshotInfo snap = snapshotFactory.getSnapshot(destroyedSnapshotStoreVO.getSnapshotId(), store);
@@ -1169,70 +1132,37 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
                         }
 
                         if (s_logger.isDebugEnabled()) {
-                            s_logger.debug("Deleting snapshot on store: " + destroyedSnapshotStoreVO);
+                            s_logger.debug("Deleting snapshot store DB entry: " + destroyedSnapshotStoreVO);
                         }
 
-                        String installPath = destroyedSnapshotStoreVO.getInstallPath();
-
-                        if (installPath != null) {
-                            EndPoint ep = _epSelector.select(store);
-                            DeleteCommand cmd = new DeleteCommand(snap.getTO());
-                            Answer answer = ep.sendMessage(cmd);
-                            if (answer == null || !answer.getResult()) {
-                                s_logger.debug("Failed to delete " + destroyedSnapshotStoreVO + " due to "
-                                        + ((answer == null) ? "answer is null" : answer.getDetails()));
-                            } else {
-                                _volumeStoreDao.remove(destroyedSnapshotStoreVO.getId());
-                                s_logger.debug("Deleted snapshot at: " + destroyedSnapshotStoreVO.getInstallPath());
-                            }
-                        } else {
-                            _snapshotStoreDao.remove(destroyedSnapshotStoreVO.getId());
-                        }
+                        _snapshotStoreDao.remove(destroyedSnapshotStoreVO.getId());
                     }
 
                 } catch (Exception e2) {
-                    s_logger.warn("problem cleaning up snapshots in secondary storage store " + store.getName(), e2);
+                    s_logger.warn("problem cleaning up snapshots in snapshot_store_ref for store: " + store.getName(), e2);
                 }
 
             }
 
-            // CleanUp volumes on Secondary Storage.
+            // CleanUp volumes on volume_store_ref
             for (DataStore store : imageStores) {
                 try {
                     List<VolumeDataStoreVO> destroyedStoreVOs = _volumeStoreDao.listDestroyed(store.getId());
                     s_logger.debug("Secondary storage garbage collector found " + destroyedStoreVOs.size()
-                            + " volumes to cleanup on secondary storage host: " + store.getName());
+                            + " volumes to cleanup on volume_store_ref for store: " + store.getName());
                     for (VolumeDataStoreVO destroyedStoreVO : destroyedStoreVOs) {
                         if (s_logger.isDebugEnabled()) {
-                            s_logger.debug("Deleting volume on store: " + destroyedStoreVO);
-                        }
-
-                        String installPath = destroyedStoreVO.getInstallPath();
-
-                        VolumeInfo vol = this.volFactory.getVolume(destroyedStoreVO.getVolumeId(), store);
-
-                        if (installPath != null) {
-                            EndPoint ep = _epSelector.select(store);
-                            DeleteCommand cmd = new DeleteCommand(vol.getTO());
-                            Answer answer = ep.sendMessage(cmd);
-                            if (answer == null || !answer.getResult()) {
-                                s_logger.debug("Failed to delete " + destroyedStoreVO + " due to "
-                                        + ((answer == null) ? "answer is null" : answer.getDetails()));
-                            } else {
-                                _volumeStoreDao.remove(destroyedStoreVO.getId());
-                                s_logger.debug("Deleted volume at: " + destroyedStoreVO.getInstallPath());
-                            }
-                        } else {
-                            _volumeStoreDao.remove(destroyedStoreVO.getId());
+                            s_logger.debug("Deleting volume store DB entry: " + destroyedStoreVO);
                         }
+                        _volumeStoreDao.remove(destroyedStoreVO.getId());
                     }
 
                 } catch (Exception e2) {
-                    s_logger.warn("problem cleaning up volumes in secondary storage store " + store.getName(), e2);
+                    s_logger.warn("problem cleaning up volumes in volume_store_ref for store: " + store.getName(), e2);
                 }
             }
         } catch (Exception e3) {
-            s_logger.warn("problem cleaning up secondary storage ", e3);
+            s_logger.warn("problem cleaning up secondary storage DB entries. ", e3);
         }
     }
 
@@ -1251,7 +1181,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
     @Override
     @DB
     public PrimaryDataStoreInfo preparePrimaryStorageForMaintenance(Long primaryStorageId) throws ResourceUnavailableException,
-            InsufficientCapacityException {
+    InsufficientCapacityException {
         Long userId = UserContext.current().getCallerUserId();
         User user = _userDao.findById(userId);
         Account account = UserContext.current().getCaller();
@@ -1356,7 +1286,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
                         if (pool != null
                                 && (pool.getStatus().equals(StoragePoolStatus.ErrorInMaintenance)
                                         || pool.getStatus().equals(StoragePoolStatus.PrepareForMaintenance) || pool.getStatus().equals(
-                                        StoragePoolStatus.CancelMaintenance))) {
+                                                StoragePoolStatus.CancelMaintenance))) {
                             _storagePoolWorkDao.removePendingJobsOnMsRestart(vo.getMsid(), poolId);
                             pool.setStatus(StoragePoolStatus.ErrorInMaintenance);
                             _storagePoolDao.update(poolId, pool);
@@ -1567,8 +1497,9 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
     @Override
     public boolean storagePoolHasEnoughIops(List<Volume> requestedVolumes,
             StoragePool pool) {
-        if (requestedVolumes == null || requestedVolumes.isEmpty() || pool == null)
+        if (requestedVolumes == null || requestedVolumes.isEmpty() || pool == null) {
             return false;
+        }
 
         long currentIops = 0;
 
@@ -1600,11 +1531,13 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
     @Override
     public boolean storagePoolHasEnoughSpace(List<Volume> volumes,
             StoragePool pool) {
-        if (volumes == null || volumes.isEmpty())
+        if (volumes == null || volumes.isEmpty()){
             return false;
+        }
 
-        if (!checkUsagedSpace(pool))
+        if (!checkUsagedSpace(pool)) {
             return false;
+        }
 
         // allocated space includes template of specified volume
         StoragePoolVO poolVO = _storagePoolDao.findById(pool.getId());
@@ -1617,8 +1550,9 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
                     allocatedSizeWithtemplate = _capacityMgr.getAllocatedPoolCapacity(poolVO, tmpl);
                 }
             }
-            if (volume.getState() != Volume.State.Ready)
+            if (volume.getState() != Volume.State.Ready) {
                 totalAskingSize = totalAskingSize + volume.getSize();
+            }
         }
 
         long totalOverProvCapacity;