mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
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:
parent
8fc6e263b3
commit
ed9ed446c2
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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
|
||||||
*/
|
*/
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user