mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Handle CopyCmdAnswer in VolumeObject.processEvent for image and
imageCache, and fix a bug in selecting endpoint.
This commit is contained in:
parent
383be568b3
commit
f23f341922
@ -140,28 +140,44 @@ public class AncientDataMotionStrategy implements DataMotionStrategy {
|
|||||||
protected Answer copyObject(DataObject srcData, DataObject destData) {
|
protected Answer copyObject(DataObject srcData, DataObject destData) {
|
||||||
String value = configDao.getValue(Config.PrimaryStorageDownloadWait.toString());
|
String value = configDao.getValue(Config.PrimaryStorageDownloadWait.toString());
|
||||||
int _primaryStorageDownloadWait = NumbersUtil.parseInt(value, Integer.parseInt(Config.PrimaryStorageDownloadWait.getDefaultValue()));
|
int _primaryStorageDownloadWait = NumbersUtil.parseInt(value, Integer.parseInt(Config.PrimaryStorageDownloadWait.getDefaultValue()));
|
||||||
if (needCacheStorage(srcData, destData)) {
|
Answer answer = null;
|
||||||
//need to copy it to image cache store
|
DataObject cacheData = null;
|
||||||
Scope destScope = destData.getDataStore().getScope();
|
try {
|
||||||
if (destScope instanceof ClusterScope){
|
if (needCacheStorage(srcData, destData)) {
|
||||||
ClusterScope clusterScope = (ClusterScope)destScope;
|
// need to copy it to image cache store
|
||||||
destScope = new ZoneScope(clusterScope.getZoneId());
|
Scope destScope = destData.getDataStore().getScope();
|
||||||
} else if (destScope instanceof HostScope){
|
if (destScope instanceof ClusterScope) {
|
||||||
HostScope hostScope = (HostScope)destScope;
|
ClusterScope clusterScope = (ClusterScope) destScope;
|
||||||
destScope = new ZoneScope(hostScope.getZoneId());
|
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;
|
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) {
|
protected DataObject cacheSnapshotChain(SnapshotInfo snapshot) {
|
||||||
@ -203,7 +219,7 @@ public class AncientDataMotionStrategy implements DataMotionStrategy {
|
|||||||
CopyCommand cmd = new CopyCommand(srcData.getTO(), volObj.getTO(), _createVolumeFromSnapshotWait);
|
CopyCommand cmd = new CopyCommand(srcData.getTO(), volObj.getTO(), _createVolumeFromSnapshotWait);
|
||||||
EndPoint ep = selector.select(snapObj, volObj);
|
EndPoint ep = selector.select(snapObj, volObj);
|
||||||
Answer answer = ep.sendMessage(cmd);
|
Answer answer = ep.sendMessage(cmd);
|
||||||
|
|
||||||
return answer;
|
return answer;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
s_logger.error(basicErrMsg, e);
|
s_logger.error(basicErrMsg, e);
|
||||||
@ -245,7 +261,7 @@ public class AncientDataMotionStrategy implements DataMotionStrategy {
|
|||||||
Answer answer = null;
|
Answer answer = null;
|
||||||
String errMsg = null;
|
String errMsg = null;
|
||||||
try {
|
try {
|
||||||
|
|
||||||
if (srcData.getType() == DataObjectType.SNAPSHOT
|
if (srcData.getType() == DataObjectType.SNAPSHOT
|
||||||
&& destData.getType() == DataObjectType.VOLUME) {
|
&& destData.getType() == DataObjectType.VOLUME) {
|
||||||
answer = copyVolumeFromSnapshot(srcData, destData);
|
answer = copyVolumeFromSnapshot(srcData, destData);
|
||||||
@ -306,21 +322,27 @@ public class AncientDataMotionStrategy implements DataMotionStrategy {
|
|||||||
int _backupsnapshotwait = NumbersUtil.parseInt(value, Integer.parseInt(Config.BackupSnapshotWait.getDefaultValue()));
|
int _backupsnapshotwait = NumbersUtil.parseInt(value, Integer.parseInt(Config.BackupSnapshotWait.getDefaultValue()));
|
||||||
|
|
||||||
DataObject cacheData = null;
|
DataObject cacheData = null;
|
||||||
|
Answer answer = null;
|
||||||
try {
|
try {
|
||||||
if (needCacheStorage(srcData, destData)) {
|
if (needCacheStorage(srcData, destData)) {
|
||||||
cacheData = cacheMgr.getCacheObject(srcData, destData.getDataStore().getScope());
|
cacheData = cacheMgr.getCacheObject(srcData, destData.getDataStore().getScope());
|
||||||
|
|
||||||
CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), _backupsnapshotwait);
|
CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), _backupsnapshotwait);
|
||||||
cmd.setCacheTO(cacheData.getTO());
|
cmd.setCacheTO(cacheData.getTO());
|
||||||
EndPoint ep = selector.select(srcData, destData);
|
EndPoint ep = selector.select(srcData, destData);
|
||||||
Answer answer = ep.sendMessage(cmd);
|
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;
|
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) {
|
} catch (Exception e) {
|
||||||
s_logger.debug("copy snasphot failed: " + e.toString());
|
s_logger.debug("copy snasphot failed: " + e.toString());
|
||||||
if (cacheData != null) {
|
if (cacheData != null) {
|
||||||
|
|||||||
@ -77,13 +77,14 @@ public class DefaultEndPointSelector implements EndPointSelector {
|
|||||||
protected boolean moveBetweenCacheAndImage(DataStore srcStore, DataStore destStore) {
|
protected boolean moveBetweenCacheAndImage(DataStore srcStore, DataStore destStore) {
|
||||||
DataStoreRole srcRole = srcStore.getRole();
|
DataStoreRole srcRole = srcStore.getRole();
|
||||||
DataStoreRole destRole = destStore.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;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean moveBetweenImages(DataStore srcStore, DataStore destStore) {
|
protected boolean moveBetweenImages(DataStore srcStore, DataStore destStore) {
|
||||||
DataStoreRole srcRole = srcStore.getRole();
|
DataStoreRole srcRole = srcStore.getRole();
|
||||||
DataStoreRole destRole = destStore.getRole();
|
DataStoreRole destRole = destStore.getRole();
|
||||||
|
|||||||
@ -403,13 +403,21 @@ public class VolumeObject implements VolumeInfo {
|
|||||||
vol.setPoolId(this.getDataStore().getId());
|
vol.setPoolId(this.getDataStore().getId());
|
||||||
volumeDao.update(vol.getId(), vol);
|
volumeDao.update(vol.getId(), vol);
|
||||||
}
|
}
|
||||||
} else if (this.dataStore.getRole() == DataStoreRole.Image) {
|
} else {
|
||||||
|
// image store or imageCache store
|
||||||
if (answer instanceof DownloadAnswer) {
|
if (answer instanceof DownloadAnswer) {
|
||||||
DownloadAnswer dwdAnswer = (DownloadAnswer) answer;
|
DownloadAnswer dwdAnswer = (DownloadAnswer) answer;
|
||||||
VolumeDataStoreVO volStore = this.volumeStoreDao.findByStoreVolume(this.dataStore.getId(), this.getId());
|
VolumeDataStoreVO volStore = this.volumeStoreDao.findByStoreVolume(this.dataStore.getId(), this.getId());
|
||||||
volStore.setInstallPath(dwdAnswer.getInstallPath());
|
volStore.setInstallPath(dwdAnswer.getInstallPath());
|
||||||
volStore.setChecksum(dwdAnswer.getCheckSum());
|
volStore.setChecksum(dwdAnswer.getCheckSum());
|
||||||
this.volumeStoreDao.update(volStore.getId(), volStore);
|
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) {
|
} catch (RuntimeException ex) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user