From 9b21da65d10757db29fa0ba779f424bd15c400df Mon Sep 17 00:00:00 2001 From: Min Chen Date: Tue, 4 Feb 2014 11:01:51 -0800 Subject: [PATCH] CLOUDSTACK-6025:CreateTemplate from snapshot in NFS is failing , after migarting to S3 datastore. --- .../storage/snapshot/SnapshotServiceImpl.java | 8 ++-- .../VmwareStorageSubsystemCommandHandler.java | 44 ++++++++++--------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java index d482e70b464..8331012d1e6 100644 --- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java +++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java @@ -442,10 +442,7 @@ public class SnapshotServiceImpl implements SnapshotService { } // push one individual snapshots currently on cache store to region store if it is not there already - private void syncSnapshotToRegionStore(long snapshotId, DataStore store) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("sync snapshot " + snapshotId + " from cache to object store..."); - } + private void syncSnapshotToRegionStore(long snapshotId, DataStore store){ // if snapshot is already on region wide object store, check if it is really downloaded there (by checking install_path). Sync snapshot to region // wide store if it is not there physically. SnapshotInfo snapOnStore = _snapshotFactory.getSnapshot(snapshotId, store); @@ -453,6 +450,9 @@ public class SnapshotServiceImpl implements SnapshotService { throw new CloudRuntimeException("Cannot find an entry in snapshot_store_ref for snapshot " + snapshotId + " on region store: " + store.getName()); } if (snapOnStore.getPath() == null || snapOnStore.getPath().length() == 0) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("sync snapshot " + snapshotId + " from cache to object store..."); + } // snapshot is not on region store yet, sync to region store SnapshotInfo srcSnapshot = _snapshotFactory.getReadySnapshotOnCache(snapshotId); if (srcSnapshot == null) { diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java index a5ebe2e39db..431286248b2 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java @@ -92,7 +92,8 @@ public class VmwareStorageSubsystemCommandHandler extends StorageSubsystemComman } else if (srcData.getObjectType() == DataObjectType.TEMPLATE) { // sync template from NFS cache to S3 in NFS migration to S3 case storageManager.createOvaForTemplate((TemplateObjectTO)srcData); - } else if (srcData.getObjectType() == DataObjectType.SNAPSHOT && destData.getObjectType() == DataObjectType.SNAPSHOT) { + } else if (srcData.getObjectType() == DataObjectType.SNAPSHOT) { + // pack ova first // sync snapshot from NFS cache to S3 in NFS migration to S3 case String parentPath = storageResource.getRootDir(srcDataStore.getUrl()); SnapshotObjectTO snap = (SnapshotObjectTO)srcData; @@ -101,27 +102,28 @@ public class VmwareStorageSubsystemCommandHandler extends StorageSubsystemComman String name = path.substring(index + 1); String snapDir = path.substring(0, index); storageManager.createOva(parentPath + File.separator + snapDir, name); - } else if (srcData.getObjectType() == DataObjectType.SNAPSHOT && destData.getObjectType() == DataObjectType.TEMPLATE) { - //create template from snapshot on src at first, then copy it to s3 - TemplateObjectTO cacheTemplate = (TemplateObjectTO)destData; - cacheTemplate.setDataStore(srcDataStore); - CopyCmdAnswer answer = (CopyCmdAnswer)processor.createTemplateFromSnapshot(cmd); - if (!answer.getResult()) { - return answer; + if (destData.getObjectType() == DataObjectType.TEMPLATE) { + //create template from snapshot on src at first, then copy it to s3 + TemplateObjectTO cacheTemplate = (TemplateObjectTO)destData; + cacheTemplate.setDataStore(srcDataStore); + CopyCmdAnswer answer = (CopyCmdAnswer)processor.createTemplateFromSnapshot(cmd); + if (!answer.getResult()) { + return answer; + } + cacheTemplate.setDataStore(destDataStore); + TemplateObjectTO template = (TemplateObjectTO)answer.getNewData(); + template.setDataStore(srcDataStore); + CopyCommand newCmd = new CopyCommand(template, destData, cmd.getWait(), cmd.executeInSequence()); + Answer result = storageResource.defaultAction(newCmd); + //clean up template data on staging area + try { + DeleteCommand deleteCommand = new DeleteCommand(template); + storageResource.defaultAction(deleteCommand); + } catch (Exception e) { + s_logger.debug("Failed to clean up staging area:", e); + } + return result; } - cacheTemplate.setDataStore(destDataStore); - TemplateObjectTO template = (TemplateObjectTO)answer.getNewData(); - template.setDataStore(srcDataStore); - CopyCommand newCmd = new CopyCommand(template, destData, cmd.getWait(), cmd.executeInSequence()); - Answer result = storageResource.defaultAction(newCmd); - //clean up template data on staging area - try { - DeleteCommand deleteCommand = new DeleteCommand(template); - storageResource.defaultAction(deleteCommand); - } catch (Exception e) { - s_logger.debug("Failed to clean up staging area:", e); - } - return result; } needDelegation = true; }