You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ed...@apache.org on 2013/04/11 20:01:51 UTC
[3/3] git commit: updated refs/heads/object_store to 1c448cd
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 <ed...@citrix.com>
Authored: Thu Apr 11 11:01:29 2013 -0700
Committer: Edison Su <ed...@citrix.com>
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) {