Return-Path: X-Original-To: apmail-cloudstack-commits-archive@www.apache.org Delivered-To: apmail-cloudstack-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 7843910BFD for ; Sat, 26 Oct 2013 04:19:00 +0000 (UTC) Received: (qmail 40299 invoked by uid 500); 26 Oct 2013 04:18:51 -0000 Delivered-To: apmail-cloudstack-commits-archive@cloudstack.apache.org Received: (qmail 40262 invoked by uid 500); 26 Oct 2013 04:18:49 -0000 Mailing-List: contact commits-help@cloudstack.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cloudstack.apache.org Delivered-To: mailing list commits@cloudstack.apache.org Received: (qmail 40179 invoked by uid 99); 26 Oct 2013 04:18:47 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 26 Oct 2013 04:18:47 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 2114A81EBC6; Sat, 26 Oct 2013 04:18:45 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: mchen@apache.org To: commits@cloudstack.apache.org Date: Sat, 26 Oct 2013 04:18:47 -0000 Message-Id: <4132e263c0a44c27b7bf07edc2d1a826@git.apache.org> In-Reply-To: <8e2ddc29a20945bead0a129aab210112@git.apache.org> References: <8e2ddc29a20945bead0a129aab210112@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [4/8] git commit: updated refs/heads/object_store_migration to 9da56fe Delete cache entries of template, snapshot, and volume when deleteTemplate, deleteSnapshot, deleteVolume are invoked. Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/730832d8 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/730832d8 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/730832d8 Branch: refs/heads/object_store_migration Commit: 730832d8fa5e75d7a30f990046ab3a004abda0fa Parents: 184e539 Author: Min Chen Authored: Wed Oct 23 14:05:05 2013 -0700 Committer: Min Chen Committed: Wed Oct 23 14:05:05 2013 -0700 ---------------------------------------------------------------------- .../subsystem/api/storage/DataStoreManager.java | 3 ++ .../api/storage/SnapshotDataFactory.java | 4 +++ .../api/storage/TemplateDataFactory.java | 4 +++ .../api/storage/VolumeDataFactory.java | 4 +++ .../storage/datastore/db/ImageStoreDao.java | 2 ++ .../datastore/db/SnapshotDataStoreDao.java | 2 ++ .../datastore/db/TemplateDataStoreDao.java | 2 ++ .../storage/image/TemplateDataFactoryImpl.java | 16 ++++++++++ .../manager/ImageStoreProviderManagerImpl.java | 15 +++++++-- .../snapshot/SnapshotDataFactoryImpl.java | 22 +++++++++++-- .../snapshot/XenserverSnapshotStrategy.java | 31 ++++++++++++------ .../storage/datastore/DataStoreManagerImpl.java | 5 +++ .../datastore/ImageStoreProviderManager.java | 2 ++ .../storage/image/db/ImageStoreDaoImpl.java | 10 +++++- .../image/db/SnapshotDataStoreDaoImpl.java | 8 +++++ .../image/db/TemplateDataStoreDaoImpl.java | 8 +++++ .../image/db/VolumeDataStoreDaoImpl.java | 1 + .../storage/volume/VolumeDataFactoryImpl.java | 33 +++++++++++++++++--- .../com/cloud/storage/VolumeApiServiceImpl.java | 12 +++++-- .../template/HypervisorTemplateAdapter.java | 29 ++++++++++------- .../com/cloud/template/TemplateManagerImpl.java | 1 + 21 files changed, 181 insertions(+), 33 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java ---------------------------------------------------------------------- diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java index 0884453..7fbec0a 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java @@ -19,6 +19,7 @@ package org.apache.cloudstack.engine.subsystem.api.storage; import java.util.List; + import com.cloud.storage.DataStoreRole; public interface DataStoreManager { @@ -37,4 +38,6 @@ public interface DataStoreManager { DataStore getImageCacheStore(long zoneId); List listImageStores(); + + List listImageCacheStores(); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotDataFactory.java ---------------------------------------------------------------------- diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotDataFactory.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotDataFactory.java index 0b8d1f1..d5255f4 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotDataFactory.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotDataFactory.java @@ -18,6 +18,8 @@ */ package org.apache.cloudstack.engine.subsystem.api.storage; +import java.util.List; + import com.cloud.storage.DataStoreRole; public interface SnapshotDataFactory { @@ -26,4 +28,6 @@ public interface SnapshotDataFactory { SnapshotInfo getSnapshot(DataObject obj, DataStore store); SnapshotInfo getSnapshot(long snapshotId, DataStoreRole role); + + List listSnapshotOnCache(long snapshotId); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java ---------------------------------------------------------------------- diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java index 980ed31..801c442 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java @@ -18,6 +18,8 @@ */ package org.apache.cloudstack.engine.subsystem.api.storage; +import java.util.List; + import com.cloud.storage.DataStoreRole; public interface TemplateDataFactory { @@ -30,4 +32,6 @@ public interface TemplateDataFactory { TemplateInfo getTemplate(long templateId, DataStoreRole storeRole, Long zoneId); TemplateInfo getReadyTemplateOnCache(long templateId); + + List listTemplateOnCache(long templateId); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeDataFactory.java ---------------------------------------------------------------------- diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeDataFactory.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeDataFactory.java index 99e3b59..3de0b5b 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeDataFactory.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeDataFactory.java @@ -18,6 +18,8 @@ */ package org.apache.cloudstack.engine.subsystem.api.storage; +import java.util.List; + import com.cloud.storage.DataStoreRole; public interface VolumeDataFactory { @@ -28,4 +30,6 @@ public interface VolumeDataFactory { VolumeInfo getVolume(long volumeId, DataStoreRole storeRole); VolumeInfo getVolume(long volumeId); + + List listVolumeOnCache(long volumeId); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java ---------------------------------------------------------------------- diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java index f95e66c..d0f8fe8 100644 --- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java +++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java @@ -36,4 +36,6 @@ public interface ImageStoreDao extends GenericDao { List findImageCacheByScope(ZoneScope scope); List listImageStores(); + + List listImageCacheStores(); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java ---------------------------------------------------------------------- diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java index df74c17..19eac38 100644 --- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java +++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java @@ -43,4 +43,6 @@ StateDao findBySnapshotId(long snapshotId); void duplicateCacheRecordsOnRegionStore(long storeId); + + List listOnCache(long snapshotId); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java ---------------------------------------------------------------------- diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java index fc61be5..95cbdb6 100644 --- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java +++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java @@ -66,4 +66,6 @@ StateDao listOnCache(long templateId); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java index fe1c62c..6369311 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java @@ -18,6 +18,9 @@ */ package org.apache.cloudstack.storage.image; +import java.util.ArrayList; +import java.util.List; + import javax.inject.Inject; import org.apache.log4j.Logger; @@ -127,4 +130,17 @@ public class TemplateDataFactoryImpl implements TemplateDataFactory { } + @Override + public List listTemplateOnCache(long templateId) { + List cacheTmpls = templateStoreDao.listOnCache(templateId); + List tmplObjs = new ArrayList(); + for (TemplateDataStoreVO cacheTmpl : cacheTmpls) { + long storeId = cacheTmpl.getDataStoreId(); + DataStore store = storeMgr.getDataStore(storeId, DataStoreRole.ImageCache); + TemplateInfo tmplObj = getTemplate(templateId, store); + tmplObjs.add(tmplObj); + } + return tmplObjs; + } + } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java index 64ef78f..0991860 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java @@ -26,6 +26,9 @@ import java.util.Map; import javax.annotation.PostConstruct; import javax.inject.Inject; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManager; import org.apache.cloudstack.engine.subsystem.api.storage.ImageStoreProvider; @@ -37,8 +40,6 @@ import org.apache.cloudstack.storage.image.ImageStoreDriver; import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity; import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager; import org.apache.cloudstack.storage.image.store.ImageStoreImpl; -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; import com.cloud.storage.ScopeType; import com.cloud.storage.dao.VMTemplateDao; @@ -95,6 +96,16 @@ public class ImageStoreProviderManagerImpl implements ImageStoreProviderManager } @Override + public List listImageCacheStores() { + List stores = dataStoreDao.listImageCacheStores(); + List imageStores = new ArrayList(); + for (ImageStoreVO store : stores) { + imageStores.add(getImageStore(store.getId())); + } + return imageStores; + } + + @Override public List listImageStoresByScope(ZoneScope scope) { List stores = dataStoreDao.findByScope(scope); List imageStores = new ArrayList(); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java index aafdad0..6205fe4 100644 --- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java +++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotDataFactoryImpl.java @@ -18,8 +18,13 @@ */ package org.apache.cloudstack.storage.snapshot; +import java.util.ArrayList; +import java.util.List; + import javax.inject.Inject; +import org.springframework.stereotype.Component; + import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; @@ -28,7 +33,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO; -import org.springframework.stereotype.Component; import com.cloud.storage.DataStoreRole; import com.cloud.storage.SnapshotVO; @@ -70,8 +74,22 @@ public class SnapshotDataFactoryImpl implements SnapshotDataFactory { if (snapshotStore == null) { return null; } - DataStore store = this.storeMgr.getDataStore(snapshotStore.getDataStoreId(), role); + DataStore store = storeMgr.getDataStore(snapshotStore.getDataStoreId(), role); SnapshotObject so = SnapshotObject.getSnapshotObject(snapshot, store); return so; } + + @Override + public List listSnapshotOnCache(long snapshotId) { + List cacheSnapshots = snapshotStoreDao.listOnCache(snapshotId); + List snapObjs = new ArrayList(); + for (SnapshotDataStoreVO cacheSnap : cacheSnapshots) { + long storeId = cacheSnap.getDataStoreId(); + DataStore store = storeMgr.getDataStore(storeId, DataStoreRole.ImageCache); + SnapshotInfo tmplObj = getSnapshot(snapshotId, store); + snapObjs.add(tmplObj); + } + return snapObjs; + } + } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java ---------------------------------------------------------------------- diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java index 6a874d6..cf67aeb 100644 --- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java +++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java @@ -16,8 +16,13 @@ // under the License. package org.apache.cloudstack.storage.snapshot; +import java.util.List; + import javax.inject.Inject; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event; @@ -33,8 +38,6 @@ import org.apache.cloudstack.storage.command.CreateObjectAnswer; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO; import org.apache.cloudstack.storage.to.SnapshotObjectTO; -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; import com.cloud.exception.InvalidParameterValueException; import com.cloud.storage.DataStoreRole; @@ -74,7 +77,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase { if (parentSnapshot != null && snapshot.getPath().equalsIgnoreCase(parentSnapshot.getPath())) { s_logger.debug("backup an empty snapshot"); // don't need to backup this snapshot - SnapshotDataStoreVO parentSnapshotOnBackupStore = this.snapshotStoreDao.findBySnapshot( + SnapshotDataStoreVO parentSnapshotOnBackupStore = snapshotStoreDao.findBySnapshot( parentSnapshot.getId(), DataStoreRole.Image); if (parentSnapshotOnBackupStore != null && parentSnapshotOnBackupStore.getState() == State.Ready) { DataStore store = dataStoreMgr.getDataStore(parentSnapshotOnBackupStore.getDataStoreId(), @@ -96,7 +99,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase { s_logger.debug("Failed to change state: " + snapshot.getId() + ": " + e.toString()); throw new CloudRuntimeException(e.toString()); } - return this.snapshotDataFactory.getSnapshot(snapObj.getId(), store); + return snapshotDataFactory.getSnapshot(snapObj.getId(), store); } else { s_logger.debug("parent snapshot hasn't been backed up yet"); } @@ -114,7 +117,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase { int i; SnapshotDataStoreVO parentSnapshotOnBackupStore = null; for (i = 1; i < deltaSnap; i++) { - parentSnapshotOnBackupStore = this.snapshotStoreDao.findBySnapshot(parentSnapshot.getId(), + parentSnapshotOnBackupStore = snapshotStoreDao.findBySnapshot(parentSnapshot.getId(), DataStoreRole.Image); if (parentSnapshotOnBackupStore == null) { break; @@ -125,7 +128,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase { break; } - parentSnapshotOnBackupStore = this.snapshotStoreDao.findBySnapshot(prevBackupId, DataStoreRole.Image); + parentSnapshotOnBackupStore = snapshotStoreDao.findBySnapshot(prevBackupId, DataStoreRole.Image); } if (i >= deltaSnap) { fullBackup = true; @@ -133,7 +136,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase { } snapshot.addPayload(fullBackup); - return this.snapshotSvr.backupSnapshot(snapshot); + return snapshotSvr.backupSnapshot(snapshot); } protected boolean deleteSnapshotChain(SnapshotInfo snapshot) { @@ -167,7 +170,15 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase { } } if (!deleted) { - boolean r = this.snapshotSvr.deleteSnapshot(snapshot); + boolean r = snapshotSvr.deleteSnapshot(snapshot); + if (r) { + // delete snapshot in cache if there is + List cacheSnaps = snapshotDataFactory.listSnapshotOnCache(snapshot.getId()); + for (SnapshotInfo cacheSnap : cacheSnaps) { + s_logger.debug("Delete snapshot " + snapshot.getId() + " from image cache store: " + cacheSnap.getDataStore().getName()); + cacheSnap.delete(); + } + } if (!resultIsSet) { result = r; resultIsSet = true; @@ -203,7 +214,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase { // first mark the snapshot as destroyed, so that ui can't see it, but we // may not destroy the snapshot on the storage, as other snapshots may // depend on it. - SnapshotInfo snapshotOnImage = this.snapshotDataFactory.getSnapshot(snapshotId, DataStoreRole.Image); + SnapshotInfo snapshotOnImage = snapshotDataFactory.getSnapshot(snapshotId, DataStoreRole.Image); if (snapshotOnImage == null) { s_logger.debug("Can't find snapshot on backup storage, delete it in db"); snapshotDao.remove(snapshotId); @@ -276,7 +287,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase { snapshot = result.getSnashot(); DataStore primaryStore = snapshot.getDataStore(); - SnapshotInfo backupedSnapshot = this.backupSnapshot(snapshot); + SnapshotInfo backupedSnapshot = backupSnapshot(snapshot); try { SnapshotInfo parent = snapshot.getParent(); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java index a9263a9..88061aa 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java @@ -107,6 +107,11 @@ public class DataStoreManagerImpl implements DataStoreManager { return imageDataStoreMgr.listImageStores(); } + @Override + public List listImageCacheStores() { + return imageDataStoreMgr.listImageCacheStores(); + } + public void setPrimaryStoreMgr(PrimaryDataStoreProviderManager primaryStoreMgr) { this.primaryStoreMgr = primaryStoreMgr; } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java ---------------------------------------------------------------------- diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java index be66cc5..8afb3d9 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java @@ -32,6 +32,8 @@ public interface ImageStoreProviderManager { List listImageStores(); + List listImageCacheStores(); + List listImageStoresByScope(ZoneScope scope); List listImageStoreByProvider(String provider); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java index b9ef9c3..13a7f47 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java @@ -23,10 +23,11 @@ import java.util.Map; import javax.naming.ConfigurationException; +import org.springframework.stereotype.Component; + import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; -import org.springframework.stereotype.Component; import com.cloud.storage.DataStoreRole; import com.cloud.storage.ScopeType; @@ -118,4 +119,11 @@ public class ImageStoreDaoImpl extends GenericDaoBase implem return listBy(sc); } + @Override + public List listImageCacheStores() { + SearchCriteria sc = createSearchCriteria(); + sc.addAnd("role", SearchCriteria.Op.EQ, DataStoreRole.ImageCache); + return listBy(sc); + } + } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java index 5a21ae2..96a0c17 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java @@ -263,4 +263,12 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase listOnCache(long snapshotId) { + SearchCriteria sc = storeSnapshotSearch.create(); + sc.setParameters("snapshot_id", snapshotId); + sc.setParameters("store_role", DataStoreRole.ImageCache); + return search(sc, null); + } + } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java index 25f3486..5c1ec33 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java @@ -335,6 +335,14 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase listOnCache(long templateId) { + SearchCriteria sc = templateRoleSearch.create(); + sc.setParameters("template_id", templateId); + sc.setParameters("store_role", DataStoreRole.ImageCache); + return search(sc, null); + } + + @Override public List listByTemplate(long templateId) { SearchCriteria sc = templateSearch.create(); sc.setParameters("template_id", templateId); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java index e2adb3e..4118079 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java @@ -43,6 +43,7 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase updateStateSearch; private SearchBuilder volumeSearch; + private SearchBuilder volumeRoleSearch; private SearchBuilder storeSearch; private SearchBuilder cacheSearch; private SearchBuilder storeVolumeSearch; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java index 1d75ba1..8065f9c 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java @@ -18,8 +18,13 @@ */ package org.apache.cloudstack.storage.volume; +import java.util.ArrayList; +import java.util.List; + import javax.inject.Inject; +import org.springframework.stereotype.Component; + import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; @@ -27,7 +32,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao; import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO; -import org.springframework.stereotype.Component; import com.cloud.storage.DataStoreRole; import com.cloud.storage.VolumeVO; @@ -58,13 +62,13 @@ public class VolumeDataFactoryImpl implements VolumeDataFactory { if (storeRole == DataStoreRole.Image) { VolumeDataStoreVO volumeStore = volumeStoreDao.findByVolume(volumeId); if (volumeStore != null) { - DataStore store = this.storeMgr.getDataStore(volumeStore.getDataStoreId(), DataStoreRole.Image); + DataStore store = storeMgr.getDataStore(volumeStore.getDataStoreId(), DataStoreRole.Image); vol = VolumeObject.getVolumeObject(store, volumeVO); } } else { // Primary data store if (volumeVO.getPoolId() != null) { - DataStore store = this.storeMgr.getDataStore(volumeVO.getPoolId(), DataStoreRole.Primary); + DataStore store = storeMgr.getDataStore(volumeVO.getPoolId(), DataStoreRole.Primary); vol = VolumeObject.getVolumeObject(store, volumeVO); } } @@ -82,11 +86,11 @@ public class VolumeDataFactoryImpl implements VolumeDataFactory { DataStore store = null; VolumeDataStoreVO volumeStore = volumeStoreDao.findByVolume(volumeId); if (volumeStore != null) { - store = this.storeMgr.getDataStore(volumeStore.getDataStoreId(), DataStoreRole.Image); + store = storeMgr.getDataStore(volumeStore.getDataStoreId(), DataStoreRole.Image); } vol = VolumeObject.getVolumeObject(store, volumeVO); } else { - DataStore store = this.storeMgr.getDataStore(volumeVO.getPoolId(), DataStoreRole.Primary); + DataStore store = storeMgr.getDataStore(volumeVO.getPoolId(), DataStoreRole.Primary); vol = VolumeObject.getVolumeObject(store, volumeVO); } return vol; @@ -99,4 +103,23 @@ public class VolumeDataFactoryImpl implements VolumeDataFactory { return vol; } + @Override + public List listVolumeOnCache(long volumeId) { + List cacheVols = new ArrayList(); + // find all image cache stores for this zone scope + List cacheStores = storeMgr.listImageCacheStores(); + if (cacheStores == null || cacheStores.size() == 0) { + return cacheVols; + } + for (DataStore store : cacheStores) { + // check if the volume is stored there + VolumeDataStoreVO volStore = volumeStoreDao.findByStoreVolume(store.getId(), volumeId); + if (volStore != null) { + VolumeInfo vol = getVolume(volumeId, store); + cacheVols.add(vol); + } + } + return cacheVols; + } + } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/server/src/com/cloud/storage/VolumeApiServiceImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/com/cloud/storage/VolumeApiServiceImpl.java index 00df333..12f0102 100644 --- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java @@ -25,6 +25,8 @@ import java.util.concurrent.ExecutionException; import javax.inject.Inject; +import org.apache.log4j.Logger; + import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd; import org.apache.cloudstack.api.command.user.volume.CreateVolumeCmd; @@ -64,7 +66,6 @@ import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao; import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO; import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity; -import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; @@ -945,6 +946,13 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic AsyncCallFuture future2 = volService.expungeVolumeAsync(volOnSecondary); future2.get(); } + // delete all cache entries for this volume + List cacheVols = volFactory.listVolumeOnCache(volume.getId()); + for (VolumeInfo volOnCache : cacheVols) { + s_logger.info("Delete volume from image cache store: " + volOnCache.getDataStore().getName()); + volOnCache.delete(); + } + } catch (Exception e) { s_logger.warn("Failed to expunge volume:", e); return false; @@ -1725,7 +1733,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic @Inject public void setStoragePoolAllocators(List storagePoolAllocators) { - this._storagePoolAllocators = storagePoolAllocators; + _storagePoolAllocators = storagePoolAllocators; } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/server/src/com/cloud/template/HypervisorTemplateAdapter.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/template/HypervisorTemplateAdapter.java b/server/src/com/cloud/template/HypervisorTemplateAdapter.java index 00e6222..b33a192 100755 --- a/server/src/com/cloud/template/HypervisorTemplateAdapter.java +++ b/server/src/com/cloud/template/HypervisorTemplateAdapter.java @@ -25,6 +25,8 @@ import java.util.concurrent.ExecutionException; import javax.ejb.Local; import javax.inject.Inject; +import org.apache.log4j.Logger; + import org.apache.cloudstack.api.command.user.iso.DeleteIsoCmd; import org.apache.cloudstack.api.command.user.iso.RegisterIsoCmd; import org.apache.cloudstack.api.command.user.template.DeleteTemplateCmd; @@ -44,7 +46,6 @@ import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.framework.async.AsyncRpcContext; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity; -import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.alert.AlertManager; @@ -56,11 +57,11 @@ import com.cloud.event.UsageEventUtils; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.ResourceAllocationException; import com.cloud.org.Grouping; +import com.cloud.storage.ScopeType; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.TemplateType; import com.cloud.storage.TemplateProfile; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; -import com.cloud.storage.ScopeType; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateZoneVO; import com.cloud.storage.dao.VMTemplateZoneDao; @@ -182,7 +183,7 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase { } // find all eligible image stores for this zone scope - List imageStores = this.storeMgr.getImageStoresByScope(new ZoneScope(profile.getZoneId())); + List imageStores = storeMgr.getImageStoresByScope(new ZoneScope(profile.getZoneId())); if ( imageStores == null || imageStores.size() == 0 ){ throw new CloudRuntimeException("Unable to find image store to download template "+ profile.getTemplate()); } @@ -205,12 +206,12 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase { } } - TemplateInfo tmpl = this.imageFactory.getTemplate(template.getId(), imageStore); + TemplateInfo tmpl = imageFactory.getTemplate(template.getId(), imageStore); CreateTemplateContext context = new CreateTemplateContext(null, tmpl); AsyncCallbackDispatcher caller = AsyncCallbackDispatcher.create(this); caller.setCallback(caller.getTarget().createTemplateAsyncCallBack(null, null)); caller.setContext(context); - this.imageService.createTemplateAsync(tmpl, imageStore, caller); + imageService.createTemplateAsync(tmpl, imageStore, caller); if( !(profile.getIsPublic() || profile.getFeatured()) ){ // If private template then break break; } @@ -237,7 +238,7 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase { // populated template entry _tmpltDao.remove(template.getId()); } else { - VMTemplateVO tmplt = this._tmpltDao.findById(template.getId()); + VMTemplateVO tmplt = _tmpltDao.findById(template.getId()); long accountId = tmplt.getAccountId(); if (template.getSize() != null) { // publish usage event @@ -283,7 +284,7 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase { VMTemplateVO template = profile.getTemplate(); // find all eligible image stores for this template - List imageStores = this.templateMgr.getImageStoreByTemplate(template.getId(), profile.getZoneId()); + List imageStores = templateMgr.getImageStoreByTemplate(template.getId(), profile.getZoneId()); if (imageStores == null || imageStores.size() == 0) { // already destroyed on image stores s_logger.info("Unable to find image store still having template: " + template.getName() @@ -321,7 +322,7 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase { } s_logger.info("Delete template from image store: " + imageStore.getName()); - AsyncCallFuture future = this.imageService.deleteTemplateAsync(this.imageFactory + AsyncCallFuture future = imageService.deleteTemplateAsync(imageFactory .getTemplate(template.getId(), imageStore)); try { TemplateApiResult result = future.get(); @@ -350,9 +351,15 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase { } } if (success) { + // delete all cache entries for this template + List cacheTmpls = imageFactory.listTemplateOnCache(template.getId()); + for (TemplateInfo tmplOnCache : cacheTmpls) { + s_logger.info("Delete template from image cache store: " + tmplOnCache.getDataStore().getName()); + tmplOnCache.delete(); + } // find all eligible image stores for this template - List iStores = this.templateMgr.getImageStoreByTemplate(template.getId(), null); + List iStores = templateMgr.getImageStoreByTemplate(template.getId(), null); if (iStores == null || iStores.size() == 0) { // remove template from vm_templates table if (_tmpltDao.remove(template.getId())) { @@ -380,7 +387,7 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase { throw new InvalidParameterValueException("The DomR template cannot be deleted."); } - if (zoneId != null && (this.storeMgr.getImageStore(zoneId) == null)) { + if (zoneId != null && (storeMgr.getImageStore(zoneId) == null)) { throw new InvalidParameterValueException("Failed to find a secondary storage in the specified zone."); } @@ -392,7 +399,7 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase { TemplateProfile profile = super.prepareDelete(cmd); Long zoneId = profile.getZoneId(); - if (zoneId != null && (this.storeMgr.getImageStore(zoneId) == null)) { + if (zoneId != null && (storeMgr.getImageStore(zoneId) == null)) { throw new InvalidParameterValueException("Failed to find a secondary storage in the specified zone."); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/730832d8/server/src/com/cloud/template/TemplateManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java index 452e079..3b2ec58 100755 --- a/server/src/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/com/cloud/template/TemplateManagerImpl.java @@ -1707,6 +1707,7 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager, return stores; } + @Override public VMTemplateVO updateTemplate(UpdateIsoCmd cmd) { return updateTemplateOrIso(cmd);