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
This commit is contained in:
edison 2014-03-18 12:20:14 +01:00 committed by Daan Hoogland
parent 8fc6e263b3
commit ed9ed446c2
5 changed files with 38 additions and 1 deletions

View File

@ -25,6 +25,8 @@ import com.cloud.storage.DataStoreRole;
public interface TemplateDataFactory { public interface TemplateDataFactory {
TemplateInfo getTemplate(long templateId, DataStore store); TemplateInfo getTemplate(long templateId, DataStore store);
TemplateInfo getReadyTemplateOnImageStore(long templateId, Long zoneId);
TemplateInfo getTemplate(DataObject obj, DataStore store); TemplateInfo getTemplate(DataObject obj, DataStore store);
TemplateInfo getTemplate(long templateId, DataStoreRole storeRole); TemplateInfo getTemplate(long templateId, DataStoreRole storeRole);

View File

@ -1126,7 +1126,12 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
future = volService.createVolumeAsync(volume, destPool); future = volService.createVolumeAsync(volume, destPool);
} else { } 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; PrimaryDataStore primaryDataStore = (PrimaryDataStore)destPool;

View File

@ -65,6 +65,8 @@ public interface TemplateDataStoreDao extends GenericDao<TemplateDataStoreVO, Lo
List<TemplateDataStoreVO> listByTemplate(long templateId); List<TemplateDataStoreVO> listByTemplate(long templateId);
TemplateDataStoreVO findByTemplateZoneReady(long templateId, Long zoneId);
void duplicateCacheRecordsOnRegionStore(long storeId); void duplicateCacheRecordsOnRegionStore(long storeId);
TemplateDataStoreVO findReadyOnCache(long templateId); TemplateDataStoreVO findReadyOnCache(long templateId);

View File

@ -23,6 +23,7 @@ import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
import com.cloud.utils.exception.CloudRuntimeException;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -106,6 +107,17 @@ public class TemplateDataFactoryImpl implements TemplateDataFactory {
return this.getTemplate(templateId, store); return this.getTemplate(templateId, store);
} }
@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 @Override
public TemplateInfo getTemplate(DataObject obj, DataStore store) { public TemplateInfo getTemplate(DataObject obj, DataStore store) {
TemplateObject tmpObj = (TemplateObject)this.getTemplate(obj.getId(), store); TemplateObject tmpObj = (TemplateObject)this.getTemplate(obj.getId(), store);

View File

@ -400,6 +400,22 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
return null; 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 * Duplicate all image cache store entries
*/ */