add cache storage
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/1c448cd6 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/1c448cd6 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/1c448cd6 Branch: refs/heads/object_store Commit: 1c448cd6e3bde8f9cff63f652d592a9ff7f7c8f7 Parents: e5bf38e Author: Edison Su <[email protected]> Authored: Thu Apr 11 11:01:29 2013 -0700 Committer: Edison Su <[email protected]> Committed: Thu Apr 11 11:01:29 2013 -0700 ---------------------------------------------------------------------- .../subsystem/api/storage/StorageCacheManager.java | 1 + .../cache/manager/StorageCacheManagerImpl.java | 14 +++++ .../storage/snapshot/SnapshotDataFactoryImpl.java | 2 +- .../snapshot/strategy/AncientSnapshotStrategy.java | 2 +- .../datastore/ObjectInDataStoreManager.java | 2 +- .../datastore/ObjectInDataStoreManagerImpl.java | 23 +++++++- .../cloudstack/storage/db/ObjectInDataStoreVO.java | 32 ++++++------ .../storage/volume/VolumeDataFactoryImpl.java | 2 +- .../storage/volume/VolumeServiceImpl.java | 40 ++++++++++++++- 9 files changed, 93 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1c448cd6/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageCacheManager.java ---------------------------------------------------------------------- diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageCacheManager.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageCacheManager.java index 0fdec11..70332c7 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageCacheManager.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageCacheManager.java @@ -21,4 +21,5 @@ package org.apache.cloudstack.engine.subsystem.api.storage; public interface StorageCacheManager { public DataStore getCacheStorage(Scope scope); + public DataObject createCacheObject(DataObject data, Scope scope); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1c448cd6/engine/storage/cache/src/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/cache/src/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java b/engine/storage/cache/src/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java index c85565d..f943ed4 100644 --- a/engine/storage/cache/src/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java +++ b/engine/storage/cache/src/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java @@ -24,6 +24,8 @@ import java.util.Map; import javax.inject.Inject; import javax.naming.ConfigurationException; +import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionService; +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.Scope; import org.apache.cloudstack.engine.subsystem.api.storage.StorageCacheManager; @@ -34,6 +36,8 @@ import com.cloud.utils.component.Manager; public class StorageCacheManagerImpl implements StorageCacheManager, Manager { @Inject List<StorageCacheAllocator> storageCacheAllocator; + @Inject + DataMotionService dataMotionSvr; @Override public DataStore getCacheStorage(Scope scope) { for (StorageCacheAllocator allocator : storageCacheAllocator) { @@ -97,4 +101,14 @@ public class StorageCacheManagerImpl implements StorageCacheManager, Manager { // TODO Auto-generated method stub return true; } + + @Override + public DataObject createCacheObject(DataObject data, Scope scope) { + DataStore cacheStore = this.getCacheStorage(scope); + DataObject objOnCacheStore = cacheStore.create(data); + //AsyncCallFuture<> + //dataMotionSvr.copyAsync(data, objOnCacheStore, callback); + // TODO Auto-generated method stub + return null; + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1c448cd6/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 0bd40d3..6a7edc2 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 @@ -63,7 +63,7 @@ public class SnapshotDataFactoryImpl implements SnapshotDataFactory { SnapshotVO snapshot = snapshotDao.findByIdIncludingRemoved(snapshotId); SnapshotObject so = null; if (snapshot.getState() == Snapshot.State.BackedUp) { - DataStore store = objMap.findStore(snapshot.getUuid(), DataObjectType.SNAPSHOT, DataStoreRole.Image); + DataStore store = objMap.findStore(snapshot.getId(), DataObjectType.SNAPSHOT, DataStoreRole.Image); so = SnapshotObject.getSnapshotObject(snapshot, store); } else { VolumeInfo volume = this.volumeFactory.getVolume(snapshot.getVolumeId()); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1c448cd6/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/strategy/AncientSnapshotStrategy.java ---------------------------------------------------------------------- diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/strategy/AncientSnapshotStrategy.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/strategy/AncientSnapshotStrategy.java index 7eddb34..ce2786b 100644 --- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/strategy/AncientSnapshotStrategy.java +++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/strategy/AncientSnapshotStrategy.java @@ -470,7 +470,7 @@ public class AncientSnapshotStrategy implements SnapshotStrategy { @DB protected boolean destroySnapshotBackUp(SnapshotVO snapshot) { - DataStore store = objInStoreMgr.findStore(snapshot.getUuid(), DataObjectType.SNAPSHOT, DataStoreRole.Image); + DataStore store = objInStoreMgr.findStore(snapshot.getId(), DataObjectType.SNAPSHOT, DataStoreRole.Image); if (store == null) { s_logger.debug("Can't find snapshot" + snapshot.getId() + " backed up into image store"); return false; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1c448cd6/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java ---------------------------------------------------------------------- diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java index 17b782a..cb27c02 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java @@ -32,5 +32,5 @@ public interface ObjectInDataStoreManager { DataObjectInStore findObject(long objId, DataObjectType type, long dataStoreId, DataStoreRole role); DataObjectInStore findObject(DataObject obj, DataStore store); - DataStore findStore(String objUuid, DataObjectType type, DataStoreRole role); + DataStore findStore(long objId, DataObjectType type, DataStoreRole role); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1c448cd6/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java index 9f98d5d..ac96c5f 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java @@ -35,6 +35,7 @@ import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao; import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO; +import org.apache.cloudstack.storage.db.ObjectInDataStoreDao; import org.apache.cloudstack.storage.db.ObjectInDataStoreVO; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -69,6 +70,8 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager { VMTemplatePoolDao templatePoolDao; @Inject SnapshotDataFactory snapshotFactory; + @Inject + ObjectInDataStoreDao objInStoreDao; protected StateMachine2<State, Event, DataObjectInStore> stateMachines; public ObjectInDataStoreManagerImpl() { @@ -110,6 +113,13 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager { VMTemplateStoragePoolVO vo = new VMTemplateStoragePoolVO(dataStore.getId(), obj.getId()); vo = templatePoolDao.persist(vo); } + } else if (dataStore.getRole() == DataStoreRole.ImageCache) { + ObjectInDataStoreVO vo = new ObjectInDataStoreVO(); + vo.setDataStoreRole(dataStore.getRole()); + vo.setDataStoreId(dataStore.getId()); + vo.setObjectType(obj.getType()); + vo.setObjectId(obj.getId()); + vo = objInStoreDao.persist(vo); } else { // Image store switch ( obj.getType()){ @@ -212,6 +222,13 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager { } } else if (type == DataObjectType.TEMPLATE && role == DataStoreRole.Primary) { vo = templatePoolDao.findByPoolTemplate(dataStoreId, objId); + } else if (role == DataStoreRole.ImageCache) { + SearchCriteriaService<ObjectInDataStoreVO, ObjectInDataStoreVO> sc = SearchCriteria2.create(ObjectInDataStoreVO.class); + sc.addAnd(sc.getEntity().getObjectId(), Op.EQ, objId); + sc.addAnd(sc.getEntity().getObjectType(), Op.EQ, type); + sc.addAnd(sc.getEntity().getDataStoreId(), Op.EQ, dataStoreId); + sc.addAnd(sc.getEntity().getDataStoreRole(), Op.EQ, role); + vo = sc.find(); } else { s_logger.debug("Invalid data or store type: " + type + " " + role); throw new CloudRuntimeException("Invalid data or store type: " + type + " " + role); @@ -222,16 +239,16 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager { } @Override - public DataStore findStore(String objUuid, DataObjectType type, DataStoreRole role) { + public DataStore findStore(long objId, DataObjectType type, DataStoreRole role) { DataStore store = null; if (role == DataStoreRole.Image) { SearchCriteriaService<ObjectInDataStoreVO, ObjectInDataStoreVO> sc = SearchCriteria2.create(ObjectInDataStoreVO.class); sc.addAnd(sc.getEntity().getDataStoreRole(), Op.EQ, role); - sc.addAnd(sc.getEntity().getObjectUuid(), Op.EQ, objUuid); + sc.addAnd(sc.getEntity().getObjectId(), Op.EQ, objId); sc.addAnd(sc.getEntity().getObjectType(), Op.EQ, type); ObjectInDataStoreVO vo = sc.find(); if (vo != null) { - store = this.storeMgr.getDataStore(vo.getDataStoreUuid(), vo.getDataStoreRole()); + store = this.storeMgr.getDataStore(vo.getDataStoreId(), vo.getDataStoreRole()); } } return store; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1c448cd6/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreVO.java ---------------------------------------------------------------------- diff --git a/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreVO.java b/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreVO.java index 0fbcbb1..7b44de0 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreVO.java +++ b/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreVO.java @@ -46,15 +46,15 @@ public class ObjectInDataStoreVO implements StateObject<ObjectInDataStoreStateMa @GeneratedValue(strategy = GenerationType.IDENTITY) long id; - @Column(name = "datastore_uuid") - private String dataStoreUuid; + @Column(name = "datastore_id") + private long dataStoreId; @Column(name = "datastore_role") @Enumerated(EnumType.STRING) private DataStoreRole dataStoreRole; - @Column(name = "object_uuid") - String objectUuid; + @Column(name = "object_id") + long objectId; @Column(name = "object_type") @Enumerated(EnumType.STRING) @@ -117,14 +117,6 @@ public class ObjectInDataStoreVO implements StateObject<ObjectInDataStoreStateMa return this.id; } - public String getDataStoreUuid() { - return this.dataStoreUuid; - } - - public void setDataStoreUuid(String uuid) { - this.dataStoreUuid = uuid; - } - public DataStoreRole getDataStoreRole() { return this.dataStoreRole; } @@ -133,12 +125,12 @@ public class ObjectInDataStoreVO implements StateObject<ObjectInDataStoreStateMa this.dataStoreRole = role; } - public String getObjectUuid() { - return this.objectUuid; + public long getObjectId() { + return this.objectId; } - public void setObjectUuid(String uuid) { - this.objectUuid = uuid; + public void setObjectId(long id) { + this.objectId = id; } public DataObjectType getObjectType() { @@ -189,4 +181,12 @@ public class ObjectInDataStoreVO implements StateObject<ObjectInDataStoreStateMa public void setUpdated(Date updated) { this.updated = updated; } + + public long getDataStoreId() { + return dataStoreId; + } + + public void setDataStoreId(long dataStoreId) { + this.dataStoreId = dataStoreId; + } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1c448cd6/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 e0ecd16..3019cf2 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 @@ -55,7 +55,7 @@ public class VolumeDataFactoryImpl implements VolumeDataFactory { VolumeVO volumeVO = volumeDao.findById(volumeId); VolumeObject vol = null; if (volumeVO.getPoolId() == null) { - DataStore store = objMap.findStore(volumeVO.getUuid(), DataObjectType.VOLUME, DataStoreRole.Image); + DataStore store = objMap.findStore(volumeVO.getId(), DataObjectType.VOLUME, DataStoreRole.Image); vol = VolumeObject.getVolumeObject(store, volumeVO); } else { DataStore store = this.storeMgr.getDataStore(volumeVO.getPoolId(), DataStoreRole.Primary); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1c448cd6/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java index ff504eb..2b43ade 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java @@ -44,6 +44,8 @@ import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; +import com.cloud.configuration.Config; +import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.exception.ConcurrentOperationException; import com.cloud.storage.StoragePool; import com.cloud.storage.Volume; @@ -51,6 +53,7 @@ import com.cloud.storage.Volume.Type; import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.VolumeDao; import com.cloud.storage.snapshot.SnapshotManager; +import com.cloud.utils.NumbersUtil; import com.cloud.utils.db.DB; import com.cloud.vm.VirtualMachine; import com.cloud.vm.dao.VMInstanceDao; @@ -75,6 +78,8 @@ public class VolumeServiceImpl implements VolumeService { VolumeDataFactory volFactory; @Inject SnapshotManager snapshotMgr; @Inject VMInstanceDao vmDao; + @Inject + ConfigurationDao configDao; public VolumeServiceImpl() { } @@ -281,6 +286,24 @@ public class VolumeServiceImpl implements VolumeService { } } + private TemplateInfo waitForTemplateDownloaded(PrimaryDataStore store, TemplateInfo template) { + int storagePoolMaxWaitSeconds = NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()), 3600); + int sleepTime = 120; + int tries = storagePoolMaxWaitSeconds/sleepTime; + while (tries > 0) { + TemplateInfo tmpl = store.getTemplate(template.getId()); + if (tmpl != null) { + return tmpl; + } + try { + Thread.sleep(sleepTime * 1000); + } catch (InterruptedException e) { + s_logger.debug("waiting for template download been interrupted: " + e.toString()); + } + tries--; + } + return null; + } @DB protected void createBaseImageAsync(VolumeInfo volume, PrimaryDataStore dataStore, TemplateInfo template, AsyncCallFuture<VolumeApiResult> future) { @@ -293,8 +316,21 @@ public class VolumeServiceImpl implements VolumeService { caller.setCallback(caller.getTarget().copyBaseImageCallback(null, null)) .setContext(context); - templateOnPrimaryStoreObj.processEvent(Event.CreateOnlyRequested); - + try { + templateOnPrimaryStoreObj.processEvent(Event.CreateOnlyRequested); + } catch (Exception e) { + try { + templateOnPrimaryStoreObj = waitForTemplateDownloaded(dataStore, template); + } finally { + if (templateOnPrimaryStoreObj == null) { + VolumeApiResult result = new VolumeApiResult(volume); + result.setResult(e.toString()); + caller.complete(result); + return; + } + } + } + try { motionSrv.copyAsync(template, templateOnPrimaryStoreObj, caller); } catch (Exception e) {
