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) {