From f23f341922c951655a6dd0c3577f224456e70eb8 Mon Sep 17 00:00:00 2001 From: Min Chen Date: Tue, 21 May 2013 22:11:54 -0700 Subject: [PATCH] Handle CopyCmdAnswer in VolumeObject.processEvent for image and imageCache, and fix a bug in selecting endpoint. --- .../motion/AncientDataMotionStrategy.java | 88 ++++++++++++------- .../endpoint/DefaultEndPointSelector.java | 5 +- .../storage/volume/VolumeObject.java | 10 ++- 3 files changed, 67 insertions(+), 36 deletions(-) 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 c0a3ec63448..1e99e9efbe2 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 @@ -140,28 +140,44 @@ public class AncientDataMotionStrategy implements DataMotionStrategy { protected Answer copyObject(DataObject srcData, DataObject destData) { String value = configDao.getValue(Config.PrimaryStorageDownloadWait.toString()); int _primaryStorageDownloadWait = NumbersUtil.parseInt(value, Integer.parseInt(Config.PrimaryStorageDownloadWait.getDefaultValue())); - if (needCacheStorage(srcData, destData)) { - //need to copy it to image cache store - Scope destScope = destData.getDataStore().getScope(); - if (destScope instanceof ClusterScope){ - ClusterScope clusterScope = (ClusterScope)destScope; - destScope = new ZoneScope(clusterScope.getZoneId()); - } else if (destScope instanceof HostScope){ - HostScope hostScope = (HostScope)destScope; - destScope = new ZoneScope(hostScope.getZoneId()); + Answer answer = null; + DataObject cacheData = null; + try { + if (needCacheStorage(srcData, destData)) { + // need to copy it to image cache store + Scope destScope = destData.getDataStore().getScope(); + if (destScope instanceof ClusterScope) { + ClusterScope clusterScope = (ClusterScope) destScope; + destScope = new ZoneScope(clusterScope.getZoneId()); + } else if (destScope instanceof HostScope) { + HostScope hostScope = (HostScope) destScope; + destScope = new ZoneScope(hostScope.getZoneId()); + } + cacheData = cacheMgr.createCacheObject(srcData, destScope); + CopyCommand cmd = new CopyCommand(cacheData.getTO(), destData.getTO(), _primaryStorageDownloadWait); + EndPoint ep = selector.select(cacheData, destData); + answer = ep.sendMessage(cmd); + } else { + // handle copy it to/from cache store + CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), _primaryStorageDownloadWait); + EndPoint ep = selector.select(srcData, destData); + answer = ep.sendMessage(cmd); + } + // clean up cache entry in case of failure + if (answer == null || !answer.getResult()) { + if (cacheData != null) { + cacheMgr.deleteCacheObject(cacheData); + } } - DataObject cacheData = cacheMgr.createCacheObject(srcData, destScope); - CopyCommand cmd = new CopyCommand(cacheData.getTO(), destData.getTO(), _primaryStorageDownloadWait); - EndPoint ep = selector.select(cacheData, destData); - Answer answer = ep.sendMessage(cmd); - return answer; - } else { - //handle copy it to/from cache store - CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), _primaryStorageDownloadWait); - EndPoint ep = selector.select(srcData, destData); - Answer answer = ep.sendMessage(cmd); return answer; + } catch (Exception e) { + s_logger.debug("copy object failed: " + e.toString()); + if (cacheData != null) { + cacheMgr.deleteCacheObject(cacheData); + } + throw new CloudRuntimeException(e.toString()); } + } protected DataObject cacheSnapshotChain(SnapshotInfo snapshot) { @@ -203,7 +219,7 @@ public class AncientDataMotionStrategy implements DataMotionStrategy { CopyCommand cmd = new CopyCommand(srcData.getTO(), volObj.getTO(), _createVolumeFromSnapshotWait); EndPoint ep = selector.select(snapObj, volObj); Answer answer = ep.sendMessage(cmd); - + return answer; } catch (Exception e) { s_logger.error(basicErrMsg, e); @@ -245,7 +261,7 @@ public class AncientDataMotionStrategy implements DataMotionStrategy { Answer answer = null; String errMsg = null; try { - + if (srcData.getType() == DataObjectType.SNAPSHOT && destData.getType() == DataObjectType.VOLUME) { answer = copyVolumeFromSnapshot(srcData, destData); @@ -306,21 +322,27 @@ public class AncientDataMotionStrategy implements DataMotionStrategy { int _backupsnapshotwait = NumbersUtil.parseInt(value, Integer.parseInt(Config.BackupSnapshotWait.getDefaultValue())); DataObject cacheData = null; + Answer answer = null; try { - if (needCacheStorage(srcData, destData)) { - cacheData = cacheMgr.getCacheObject(srcData, destData.getDataStore().getScope()); + if (needCacheStorage(srcData, destData)) { + cacheData = cacheMgr.getCacheObject(srcData, destData.getDataStore().getScope()); - CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), _backupsnapshotwait); - cmd.setCacheTO(cacheData.getTO()); - EndPoint ep = selector.select(srcData, destData); - Answer answer = ep.sendMessage(cmd); + CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), _backupsnapshotwait); + cmd.setCacheTO(cacheData.getTO()); + EndPoint ep = selector.select(srcData, destData); + answer = ep.sendMessage(cmd); + } else { + CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), _backupsnapshotwait); + EndPoint ep = selector.select(srcData, destData); + answer = ep.sendMessage(cmd); + } + // clean up cache entry in case of failure + if (answer == null || !answer.getResult()) { + if (cacheData != null) { + cacheMgr.deleteCacheObject(cacheData); + } + } return answer; - } else { - CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), _backupsnapshotwait); - EndPoint ep = selector.select(srcData, destData); - Answer answer = ep.sendMessage(cmd); - return answer; - } } catch (Exception e) { s_logger.debug("copy snasphot failed: " + e.toString()); if (cacheData != null) { 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 de57dd7f2fe..2b698fb3d61 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java +++ b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java @@ -77,13 +77,14 @@ public class DefaultEndPointSelector implements EndPointSelector { protected boolean moveBetweenCacheAndImage(DataStore srcStore, DataStore destStore) { DataStoreRole srcRole = srcStore.getRole(); DataStoreRole destRole = destStore.getRole(); - if (srcRole == DataStoreRole.Image && destRole == DataStoreRole.ImageCache) { + if (srcRole == DataStoreRole.Image && destRole == DataStoreRole.ImageCache || + srcRole == DataStoreRole.ImageCache && destRole == DataStoreRole.Image) { return true; } else { return false; } } - + protected boolean moveBetweenImages(DataStore srcStore, DataStore destStore) { DataStoreRole srcRole = srcStore.getRole(); DataStoreRole destRole = destStore.getRole(); diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java index a2a9045b51f..4a3fd3f2e05 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java @@ -403,13 +403,21 @@ public class VolumeObject implements VolumeInfo { vol.setPoolId(this.getDataStore().getId()); volumeDao.update(vol.getId(), vol); } - } else if (this.dataStore.getRole() == DataStoreRole.Image) { + } else { + // image store or imageCache store if (answer instanceof DownloadAnswer) { DownloadAnswer dwdAnswer = (DownloadAnswer) answer; VolumeDataStoreVO volStore = this.volumeStoreDao.findByStoreVolume(this.dataStore.getId(), this.getId()); volStore.setInstallPath(dwdAnswer.getInstallPath()); volStore.setChecksum(dwdAnswer.getCheckSum()); this.volumeStoreDao.update(volStore.getId(), volStore); + } else if (answer instanceof CopyCmdAnswer ){ + CopyCmdAnswer cpyAnswer = (CopyCmdAnswer) answer; + VolumeDataStoreVO volStore = this.volumeStoreDao.findByStoreVolume(this.dataStore.getId(), this.getId()); + VolumeObjectTO newVol = (VolumeObjectTO) cpyAnswer.getNewData(); + volStore.setInstallPath(newVol.getPath()); + volStore.setSize(newVol.getSize()); + this.volumeStoreDao.update(volStore.getId(), volStore); } } } catch (RuntimeException ex) {