diff --git a/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java b/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java index c6b9b85c4a6..dc1b1bffaa4 100644 --- a/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java +++ b/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java @@ -182,7 +182,6 @@ public class AncientDataMotionStrategy implements DataMotionStrategy { int _primaryStorageDownloadWait = NumbersUtil.parseInt(value, Integer.parseInt(Config.PrimaryStorageDownloadWait.getDefaultValue())); Answer answer = null; - boolean usingCache = false; DataObject cacheData = null; DataObject srcForCopy = srcData; try { @@ -196,10 +195,16 @@ public class AncientDataMotionStrategy implements DataMotionStrategy { answer = ep.sendMessage(cmd); if (cacheData != null) { - if (answer == null || !answer.getResult()) { + if (srcData.getType() == DataObjectType.VOLUME && destData.getType() == DataObjectType.VOLUME) { + // volume transfer from primary to secondary or vice versa. Volume transfer between primary pools are already handled by copyVolumeBetweenPools cacheMgr.deleteCacheObject(srcForCopy); } else { - cacheMgr.releaseCacheObject(srcForCopy); + // for template, we want to leave it on cache for performance reason + if (answer == null || !answer.getResult()) { + cacheMgr.deleteCacheObject(srcForCopy); + } else { + cacheMgr.releaseCacheObject(srcForCopy); + } } } return answer; diff --git a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java index fb041941442..d2ddfd46aea 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java +++ b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java @@ -221,7 +221,7 @@ public class DefaultEndPointSelector implements EndPointSelector { public EndPoint select(DataStore store) { if (store.getRole() == DataStoreRole.Primary) { return findEndpointForPrimaryStorage(store); - } else if (store.getRole() == DataStoreRole.Image) { + } else if (store.getRole() == DataStoreRole.Image || store.getRole() == DataStoreRole.ImageCache) { // in case there is no ssvm, directly send down command hypervisor // host // otherwise, send to localhost for bootstrap system vm template diff --git a/server/src/com/cloud/storage/VolumeManagerImpl.java b/server/src/com/cloud/storage/VolumeManagerImpl.java index 92ad9542d0a..5cf7b8dc5dd 100644 --- a/server/src/com/cloud/storage/VolumeManagerImpl.java +++ b/server/src/com/cloud/storage/VolumeManagerImpl.java @@ -2780,12 +2780,8 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager { // Clean up code to remove all those previous uploadVO and uploadMonitor code. Previous code is trying to fake an async operation purely in // db table with uploadVO and async_job entry, but internal implementation is actually synchronous. - StoragePool srcPool = (StoragePool) dataStoreMgr.getPrimaryDataStore(volume.getPoolId()); ImageStoreEntity secStore = (ImageStoreEntity) dataStoreMgr.getImageStore(zoneId); - String secondaryStorageURL = secStore.getUri(); - String value = _configDao.getValue(Config.CopyVolumeWait.toString()); - int copyvolumewait = NumbersUtil.parseInt(value, Integer.parseInt(Config.CopyVolumeWait.getDefaultValue())); // Copy volume from primary to secondary storage VolumeInfo srcVol = volFactory.getVolume(volume.getId()); AsyncCallFuture cvAnswer = volService.copyVolume(srcVol, secStore);