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

Reply via email to