You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by da...@apache.org on 2014/03/26 14:56:28 UTC

git commit: updated refs/heads/4.4 to 7db6ba0

Repository: cloudstack
Updated Branches:
  refs/heads/4.4 f16dc3fd9 -> 7db6ba0c5


CLOUDSTACK-5432: potential bugs in case of stop mgt server while
template is downloading, template_store_ref has leftover not in ready
state, when create vm from that template, the code doesn't check either
zone id, nor template_store_ref state.

Conflicts:
	engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/7db6ba0c
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/7db6ba0c
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/7db6ba0c

Branch: refs/heads/4.4
Commit: 7db6ba0c5fff8a771017ec8bce124fba698efb4e
Parents: f16dc3f
Author: edison <su...@gmail.com>
Authored: Tue Mar 18 12:20:14 2014 +0100
Committer: Daan Hoogland <da...@onecht.net>
Committed: Wed Mar 26 14:55:21 2014 +0100

----------------------------------------------------------------------
 .../subsystem/api/storage/TemplateDataFactory.java  |  2 ++
 .../engine/orchestration/VolumeOrchestrator.java    |  7 ++++++-
 .../storage/datastore/db/TemplateDataStoreDao.java  |  2 ++
 .../storage/image/TemplateDataFactoryImpl.java      | 12 ++++++++++++
 .../storage/image/db/TemplateDataStoreDaoImpl.java  | 16 ++++++++++++++++
 5 files changed, 38 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7db6ba0c/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 801c442..fd22da1 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
@@ -25,6 +25,8 @@ import com.cloud.storage.DataStoreRole;
 public interface TemplateDataFactory {
     TemplateInfo getTemplate(long templateId, DataStore store);
 
+    TemplateInfo getReadyTemplateOnImageStore(long templateId, Long zoneId);
+
     TemplateInfo getTemplate(DataObject obj, DataStore store);
 
     TemplateInfo getTemplate(long templateId, DataStoreRole storeRole);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7db6ba0c/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
index 767eab2..75a23e0 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
@@ -1152,7 +1152,12 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
 
                 future = volService.createVolumeAsync(volume, destPool);
             } else {
-                TemplateInfo templ = tmplFactory.getTemplate(templateId, DataStoreRole.Image);
+    
+                TemplateInfo templ = tmplFactory.getReadyTemplateOnImageStore(templateId, dest.getDataCenter().getId());
+                if (templ == null) {
+                    s_logger.debug("can't find ready template: " + templateId + " for data center " + dest.getDataCenter().getId());
+                    throw new CloudRuntimeException("can't find ready template: " + templateId + " for data center " + dest.getDataCenter().getId());
+                }
 
                 PrimaryDataStore primaryDataStore = (PrimaryDataStore)destPool;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7db6ba0c/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 ab45889..271bbca 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
@@ -65,6 +65,8 @@ public interface TemplateDataStoreDao extends GenericDao<TemplateDataStoreVO, Lo
 
     List<TemplateDataStoreVO> listByTemplate(long templateId);
 
+    TemplateDataStoreVO findByTemplateZoneReady(long templateId, Long zoneId);
+
     void duplicateCacheRecordsOnRegionStore(long storeId);
 
     TemplateDataStoreVO findReadyOnCache(long templateId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7db6ba0c/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 db28a05..036d797 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
@@ -23,6 +23,7 @@ import java.util.List;
 
 import javax.inject.Inject;
 
+import com.cloud.utils.exception.CloudRuntimeException;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
@@ -107,6 +108,17 @@ public class TemplateDataFactoryImpl implements TemplateDataFactory {
     }
 
     @Override
+    public TemplateInfo getReadyTemplateOnImageStore(long templateId, Long zoneId) {
+        TemplateDataStoreVO tmplStore = templateStoreDao.findByTemplateZoneReady(templateId, zoneId);
+        if (tmplStore != null) {
+            DataStore store = storeMgr.getDataStore(tmplStore.getDataStoreId(), DataStoreRole.Image);
+            return this.getTemplate(templateId, store);
+        } else {
+            return null;
+        }
+    }
+
+    @Override
     public TemplateInfo getTemplate(DataObject obj, DataStore store) {
         TemplateObject tmpObj = (TemplateObject)this.getTemplate(obj.getId(), store);
         // carry over url set in passed in data object, for copyTemplate case

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7db6ba0c/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 d4b0445..cce7f08 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
@@ -400,6 +400,22 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
         return null;
     }
 
+    @Override
+    public TemplateDataStoreVO findByTemplateZoneReady(long templateId, Long zoneId) {
+        List<DataStore> imgStores = null;
+        imgStores = _storeMgr.getImageStoresByScope(new ZoneScope(zoneId));
+        if (imgStores != null) {
+            Collections.shuffle(imgStores);
+            for (DataStore store : imgStores) {
+                List<TemplateDataStoreVO> sRes = listByTemplateStoreStatus(templateId, store.getId(), State.Ready);
+                if (sRes != null && sRes.size() > 0) {
+                    return sRes.get(0);
+                }
+            }
+        }
+        return null;
+    }
+
     /**
      * Duplicate all image cache store entries
      */