Skip to content

Commit ed9ed44

Browse files
sudisonDaanHoogland
authored andcommitted
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
1 parent 8fc6e26 commit ed9ed44

5 files changed

Lines changed: 38 additions & 1 deletion

File tree

engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateDataFactory.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
public interface TemplateDataFactory {
2626
TemplateInfo getTemplate(long templateId, DataStore store);
2727

28+
TemplateInfo getReadyTemplateOnImageStore(long templateId, Long zoneId);
29+
2830
TemplateInfo getTemplate(DataObject obj, DataStore store);
2931

3032
TemplateInfo getTemplate(long templateId, DataStoreRole storeRole);

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1126,7 +1126,12 @@ private Pair<VolumeVO, DataStore> recreateVolume(VolumeVO vol, VirtualMachinePro
11261126

11271127
future = volService.createVolumeAsync(volume, destPool);
11281128
} else {
1129-
TemplateInfo templ = tmplFactory.getTemplate(templateId, DataStoreRole.Image);
1129+
1130+
TemplateInfo templ = tmplFactory.getReadyTemplateOnImageStore(templateId, dest.getDataCenter().getId());
1131+
if (templ == null) {
1132+
s_logger.debug("can't find ready template: " + templateId + " for data center " + dest.getDataCenter().getId());
1133+
throw new CloudRuntimeException("can't find ready template: " + templateId + " for data center " + dest.getDataCenter().getId());
1134+
}
11301135

11311136
PrimaryDataStore primaryDataStore = (PrimaryDataStore)destPool;
11321137

engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ public interface TemplateDataStoreDao extends GenericDao<TemplateDataStoreVO, Lo
6565

6666
List<TemplateDataStoreVO> listByTemplate(long templateId);
6767

68+
TemplateDataStoreVO findByTemplateZoneReady(long templateId, Long zoneId);
69+
6870
void duplicateCacheRecordsOnRegionStore(long storeId);
6971

7072
TemplateDataStoreVO findReadyOnCache(long templateId);

engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateDataFactoryImpl.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import javax.inject.Inject;
2525

26+
import com.cloud.utils.exception.CloudRuntimeException;
2627
import org.apache.log4j.Logger;
2728
import org.springframework.stereotype.Component;
2829

@@ -106,6 +107,17 @@ public TemplateInfo getTemplate(long templateId, DataStoreRole storeRole, Long z
106107
return this.getTemplate(templateId, store);
107108
}
108109

110+
@Override
111+
public TemplateInfo getReadyTemplateOnImageStore(long templateId, Long zoneId) {
112+
TemplateDataStoreVO tmplStore = templateStoreDao.findByTemplateZoneReady(templateId, zoneId);
113+
if (tmplStore != null) {
114+
DataStore store = storeMgr.getDataStore(tmplStore.getDataStoreId(), DataStoreRole.Image);
115+
return this.getTemplate(templateId, store);
116+
} else {
117+
return null;
118+
}
119+
}
120+
109121
@Override
110122
public TemplateInfo getTemplate(DataObject obj, DataStore store) {
111123
TemplateObject tmpObj = (TemplateObject)this.getTemplate(obj.getId(), store);

engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,22 @@ public TemplateDataStoreVO findByTemplateZone(long templateId, Long zoneId, Data
400400
return null;
401401
}
402402

403+
@Override
404+
public TemplateDataStoreVO findByTemplateZoneReady(long templateId, Long zoneId) {
405+
List<DataStore> imgStores = null;
406+
imgStores = _storeMgr.getImageStoresByScope(new ZoneScope(zoneId));
407+
if (imgStores != null) {
408+
Collections.shuffle(imgStores);
409+
for (DataStore store : imgStores) {
410+
List<TemplateDataStoreVO> sRes = listByTemplateStoreStatus(templateId, store.getId(), State.Ready);
411+
if (sRes != null && sRes.size() > 0) {
412+
return sRes.get(0);
413+
}
414+
}
415+
}
416+
return null;
417+
}
418+
403419
/**
404420
* Duplicate all image cache store entries
405421
*/

0 commit comments

Comments
 (0)