You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by mc...@apache.org on 2013/08/15 03:01:26 UTC
[2/2] git commit: updated refs/heads/4.2 to 9a9ef31
CLOUDSTACK-2583: [Object_Store_Refactor] Failed to create snapshot from
root disk of a guest VM.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/f197a7b7
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/f197a7b7
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/f197a7b7
Branch: refs/heads/4.2
Commit: f197a7b79f4ff14cf788b2f3c63f4e68f3c7311e
Parents: 42f49d0
Author: Min Chen <mi...@citrix.com>
Authored: Wed Aug 14 17:58:25 2013 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Wed Aug 14 18:01:09 2013 -0700
----------------------------------------------------------------------
.../xen/resource/XenServerStorageProcessor.java | 314 ++++++++++---------
1 file changed, 158 insertions(+), 156 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f197a7b7/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java
index 634759d..60f1ef9 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java
@@ -35,7 +35,6 @@ import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.resource.StorageProcessor;
import com.cloud.utils.S3Utils;
-import com.cloud.utils.StringUtils;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.storage.encoding.DecodedDataObject;
import com.cloud.utils.storage.encoding.DecodedDataStore;
@@ -68,7 +67,6 @@ import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
import org.apache.cloudstack.storage.to.SnapshotObjectTO;
import org.apache.cloudstack.storage.to.TemplateObjectTO;
import org.apache.cloudstack.storage.to.VolumeObjectTO;
-import org.apache.cloudstack.storage.to.VolumeObjectTO;
import org.apache.log4j.Logger;
import org.apache.xmlrpc.XmlRpcException;
@@ -101,15 +99,15 @@ public class XenServerStorageProcessor implements StorageProcessor {
String isoURL = null;
if (store == null) {
- TemplateObjectTO iso = (TemplateObjectTO)disk.getData();
- isoURL = iso.getName();
+ TemplateObjectTO iso = (TemplateObjectTO)disk.getData();
+ isoURL = iso.getName();
} else {
- if (!(store instanceof NfsTO)) {
- s_logger.debug("Can't attach a iso which is not created on nfs: ");
- return new AttachAnswer("Can't attach a iso which is not created on nfs: ");
- }
- NfsTO nfsStore = (NfsTO)store;
- isoURL = nfsStore.getUrl() + File.separator + data.getPath();
+ if (!(store instanceof NfsTO)) {
+ s_logger.debug("Can't attach a iso which is not created on nfs: ");
+ return new AttachAnswer("Can't attach a iso which is not created on nfs: ");
+ }
+ NfsTO nfsStore = (NfsTO)store;
+ isoURL = nfsStore.getUrl() + File.separator + data.getPath();
}
String vmName = cmd.getVmName();
@@ -250,15 +248,15 @@ public class XenServerStorageProcessor implements StorageProcessor {
String isoURL = null;
if (store == null) {
- TemplateObjectTO iso = (TemplateObjectTO)disk.getData();
- isoURL = iso.getName();
+ TemplateObjectTO iso = (TemplateObjectTO)disk.getData();
+ isoURL = iso.getName();
} else {
- if (!(store instanceof NfsTO)) {
- s_logger.debug("Can't attach a iso which is not created on nfs: ");
- return new AttachAnswer("Can't attach a iso which is not created on nfs: ");
- }
- NfsTO nfsStore = (NfsTO)store;
- isoURL = nfsStore.getUrl() + File.separator + data.getPath();
+ if (!(store instanceof NfsTO)) {
+ s_logger.debug("Can't attach a iso which is not created on nfs: ");
+ return new AttachAnswer("Can't attach a iso which is not created on nfs: ");
+ }
+ NfsTO nfsStore = (NfsTO)store;
+ isoURL = nfsStore.getUrl() + File.separator + data.getPath();
}
try {
@@ -443,7 +441,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
@Override
public Answer deleteVolume(DeleteCommand cmd) {
- DataTO volume = cmd.getData();
+ DataTO volume = cmd.getData();
Connection conn = hypervisorResource.getConnection();
String errorMsg = null;
try {
@@ -718,7 +716,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
try {
vdi.destroy(conn);
} catch (BadServerResponse e) {
- s_logger.debug("Failed to cleanup newly created vdi");
+ s_logger.debug("Failed to cleanup newly created vdi");
} catch (XenAPIException e) {
s_logger.debug("Failed to cleanup newly created vdi");
} catch (XmlRpcException e) {
@@ -831,9 +829,9 @@ public class XenServerStorageProcessor implements StorageProcessor {
@Override
public Answer copyTemplateToPrimaryStorage(CopyCommand cmd) {
- DataTO srcData = cmd.getSrcTO();
- DataTO destData = cmd.getDestTO();
- int wait = cmd.getWait();
+ DataTO srcData = cmd.getSrcTO();
+ DataTO destData = cmd.getDestTO();
+ int wait = cmd.getWait();
DataStoreTO srcStore = srcData.getDataStore();
try {
if ((srcStore instanceof NfsTO) && (srcData.getObjectType() == DataObjectType.TEMPLATE)) {
@@ -889,33 +887,33 @@ public class XenServerStorageProcessor implements StorageProcessor {
@Override
public Answer createVolume(CreateObjectCommand cmd) {
- DataTO data = cmd.getData();
- VolumeObjectTO volume = (VolumeObjectTO)data;
-
- try {
- Connection conn = hypervisorResource.getConnection();
- PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO)data.getDataStore();
- SR poolSr = hypervisorResource.getStorageRepository(conn, primaryStore.getUuid());
- VDI.Record vdir = new VDI.Record();
- vdir.nameLabel = volume.getName();
- vdir.SR = poolSr;
- vdir.type = Types.VdiType.USER;
-
- vdir.virtualSize = volume.getSize();
- VDI vdi;
-
- vdi = VDI.create(conn, vdir);
- vdir = vdi.getRecord(conn);
- VolumeObjectTO newVol = new VolumeObjectTO();
- newVol.setName(vdir.nameLabel);
- newVol.setSize(vdir.virtualSize);
- newVol.setPath(vdir.uuid);
-
- return new CreateObjectAnswer(newVol);
- } catch (Exception e) {
- s_logger.debug("create volume failed: " + e.toString());
- return new CreateObjectAnswer(e.toString());
- }
+ DataTO data = cmd.getData();
+ VolumeObjectTO volume = (VolumeObjectTO)data;
+
+ try {
+ Connection conn = hypervisorResource.getConnection();
+ PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO)data.getDataStore();
+ SR poolSr = hypervisorResource.getStorageRepository(conn, primaryStore.getUuid());
+ VDI.Record vdir = new VDI.Record();
+ vdir.nameLabel = volume.getName();
+ vdir.SR = poolSr;
+ vdir.type = Types.VdiType.USER;
+
+ vdir.virtualSize = volume.getSize();
+ VDI vdi;
+
+ vdi = VDI.create(conn, vdir);
+ vdir = vdi.getRecord(conn);
+ VolumeObjectTO newVol = new VolumeObjectTO();
+ newVol.setName(vdir.nameLabel);
+ newVol.setSize(vdir.virtualSize);
+ newVol.setPath(vdir.uuid);
+
+ return new CreateObjectAnswer(newVol);
+ } catch (Exception e) {
+ s_logger.debug("create volume failed: " + e.toString());
+ return new CreateObjectAnswer(e.toString());
+ }
}
@Override
@@ -1063,15 +1061,14 @@ public class XenServerStorageProcessor implements StorageProcessor {
return lfilename;
}
- private boolean backupSnapshotToS3(final Connection connection,
- final S3TO s3, final String srUuid, final String snapshotUuid,
- final Boolean iSCSIFlag, final int wait) {
+ private String backupSnapshotToS3(final Connection connection, final S3TO s3, final String srUuid, final String folder, final String snapshotUuid,
+ final Boolean iSCSIFlag, final int wait) {
final String filename = iSCSIFlag ? "VHD-" + snapshotUuid
: snapshotUuid + ".vhd";
final String dir = (iSCSIFlag ? "/dev/VG_XenStorage-"
: "/var/run/sr-mount/") + srUuid;
- final String key = String.format("/snapshots/%1$s", snapshotUuid);
+ final String key = folder + "/" + filename; // String.format("/snapshots/%1$s", snapshotUuid);
try {
@@ -1083,14 +1080,15 @@ public class XenServerStorageProcessor implements StorageProcessor {
dir + "/" + filename, "iSCSIFlag",
iSCSIFlag.toString(), "bucket", s3.getBucketName(),
"key", key, "https", s3.isHttps() != null ? s3.isHttps().toString()
- : "null"));
+ : "null"));
final String result = hypervisorResource.callHostPluginAsync(connection, "s3xen",
"s3", wait,
parameters.toArray(new String[parameters.size()]));
if (result != null && result.equals("true")) {
- return true;
+ return key;
}
+ return null;
} catch (Exception e) {
s_logger.error(String.format(
@@ -1098,7 +1096,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
snapshotUuid, e.toString()), e);
}
- return false;
+ return null;
}
@@ -1265,12 +1263,14 @@ public class XenServerStorageProcessor implements StorageProcessor {
} else if (destStore instanceof S3TO) {
try {
- backupSnapshotToS3(conn, (S3TO)destStore, snapshotSr.getUuid(conn), snapshotBackupUuid, isISCSI, wait);
- snapshotBackupUuid = snapshotBackupUuid + ".vhd";
+ finalPath = backupSnapshotToS3(conn, (S3TO) destStore, snapshotSr.getUuid(conn), folder, snapshotBackupUuid, isISCSI, wait);
+ if (finalPath == null) {
+ throw new CloudRuntimeException("S3 upload of snapshots " + snapshotBackupUuid + " failed");
+ }
} finally {
deleteSnapshotBackup(conn, localMountPoint, folder, secondaryStorageMountPath, snapshotBackupUuid);
}
- finalPath = folder + File.separator + snapshotBackupUuid;
+ // finalPath = folder + File.separator + snapshotBackupUuid;
} else {
finalPath = folder + File.separator + snapshotBackupUuid;
}
@@ -1287,11 +1287,13 @@ public class XenServerStorageProcessor implements StorageProcessor {
snapshotBackupUuid = swiftBackupSnapshot(conn, (SwiftTO)destStore, primaryStorageSRUuid, snapshotPaUuid, "S-" + snapshotTO.getVolume().getVolumeId().toString(), isISCSI, wait);
finalPath = container + File.separator + snapshotBackupUuid;
} else if (destStore instanceof S3TO ) {
- backupSnapshotToS3(conn, (S3TO)destStore, primaryStorageSRUuid, snapshotPaUuid, isISCSI, wait);
- finalPath = folder + File.separator + snapshotPaUuid;
+ finalPath = backupSnapshotToS3(conn, (S3TO) destStore, primaryStorageSRUuid, folder, snapshotPaUuid, isISCSI, wait);
+ if (finalPath == null) {
+ throw new CloudRuntimeException("S3 upload of snapshots " + snapshotPaUuid + " failed");
+ }
} else {
snapshotBackupUuid = backupSnapshot(conn, primaryStorageSRUuid, localMountPoint, folder,
- secondaryStorageMountPath, snapshotUuid, prevBackupUuid, isISCSI, wait);
+ secondaryStorageMountPath, snapshotUuid, prevBackupUuid, isISCSI, wait);
finalPath = folder + File.separator + snapshotBackupUuid;
}
@@ -1398,97 +1400,97 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
@Override
- public Answer createVolumeFromSnapshot(CopyCommand cmd) {
- Connection conn = this.hypervisorResource.getConnection();
- DataTO srcData = cmd.getSrcTO();
- SnapshotObjectTO snapshot = (SnapshotObjectTO)srcData;
- DataTO destData = cmd.getDestTO();
- PrimaryDataStoreTO pool = (PrimaryDataStoreTO)destData.getDataStore();
- DataStoreTO imageStore = srcData.getDataStore();
-
- if (!(imageStore instanceof NfsTO)) {
- return new CopyCmdAnswer("unsupported protocol");
- }
-
- NfsTO nfsImageStore = (NfsTO)imageStore;
- String primaryStorageNameLabel = pool.getUuid();
- String secondaryStorageUrl = nfsImageStore.getUrl();
- int wait = cmd.getWait();
- boolean result = false;
- // Generic error message.
- String details = null;
- String volumeUUID = null;
-
- if (secondaryStorageUrl == null) {
- details += " because the URL passed: " + secondaryStorageUrl + " is invalid.";
- return new CopyCmdAnswer(details);
- }
- try {
- SR primaryStorageSR = this.hypervisorResource.getSRByNameLabelandHost(conn, primaryStorageNameLabel);
- if (primaryStorageSR == null) {
- throw new InternalErrorException("Could not create volume from snapshot because the primary Storage SR could not be created from the name label: "
- + primaryStorageNameLabel);
- }
- // Get the absolute path of the snapshot on the secondary storage.
- String snapshotInstallPath = snapshot.getPath();
- int index = snapshotInstallPath.lastIndexOf(File.separator);
- String snapshotName = snapshotInstallPath.substring(index + 1);
-
- if (!snapshotName.startsWith("VHD-") && !snapshotName.endsWith(".vhd")) {
- snapshotInstallPath = snapshotInstallPath + ".vhd";
- }
- URI snapshotURI = new URI(secondaryStorageUrl + File.separator + snapshotInstallPath);
- String snapshotPath = snapshotURI.getHost() + ":" + snapshotURI.getPath();
- String srUuid = primaryStorageSR.getUuid(conn);
- volumeUUID = copy_vhd_from_secondarystorage(conn, snapshotPath, srUuid, wait);
- result = true;
- VDI volume = VDI.getByUuid(conn, volumeUUID);
- VDI.Record vdir = volume.getRecord(conn);
- VolumeObjectTO newVol = new VolumeObjectTO();
- newVol.setPath(volumeUUID);
- newVol.setSize(vdir.virtualSize);
- return new CopyCmdAnswer(newVol);
- } catch (XenAPIException e) {
- details += " due to " + e.toString();
- s_logger.warn(details, e);
- } catch (Exception e) {
- details += " due to " + e.getMessage();
- s_logger.warn(details, e);
- }
- if (!result) {
- // Is this logged at a higher level?
- s_logger.error(details);
- }
-
- // In all cases return something.
- return new CopyCmdAnswer(details);
- }
-
- @Override
- public Answer deleteSnapshot(DeleteCommand cmd) {
- SnapshotObjectTO snapshot = (SnapshotObjectTO)cmd.getData();
- DataStoreTO store = snapshot.getDataStore();
- if (store.getRole() == DataStoreRole.Primary) {
- Connection conn = this.hypervisorResource.getConnection();
- VDI snapshotVdi = getVDIbyUuid(conn, snapshot.getPath());
- if (snapshotVdi == null) {
- return new Answer(null);
- }
- String errMsg = null;
- try {
- this.deleteVDI(conn, snapshotVdi);
- } catch (BadServerResponse e) {
- s_logger.debug("delete snapshot failed:" + e.toString());
- errMsg = e.toString();
- } catch (XenAPIException e) {
- s_logger.debug("delete snapshot failed:" + e.toString());
- errMsg = e.toString();
- } catch (XmlRpcException e) {
- s_logger.debug("delete snapshot failed:" + e.toString());
- errMsg = e.toString();
- }
- return new Answer(cmd, false, errMsg);
- }
- return new Answer(cmd, false, "unsupported storage type");
- }
+ public Answer createVolumeFromSnapshot(CopyCommand cmd) {
+ Connection conn = this.hypervisorResource.getConnection();
+ DataTO srcData = cmd.getSrcTO();
+ SnapshotObjectTO snapshot = (SnapshotObjectTO)srcData;
+ DataTO destData = cmd.getDestTO();
+ PrimaryDataStoreTO pool = (PrimaryDataStoreTO)destData.getDataStore();
+ DataStoreTO imageStore = srcData.getDataStore();
+
+ if (!(imageStore instanceof NfsTO)) {
+ return new CopyCmdAnswer("unsupported protocol");
+ }
+
+ NfsTO nfsImageStore = (NfsTO)imageStore;
+ String primaryStorageNameLabel = pool.getUuid();
+ String secondaryStorageUrl = nfsImageStore.getUrl();
+ int wait = cmd.getWait();
+ boolean result = false;
+ // Generic error message.
+ String details = null;
+ String volumeUUID = null;
+
+ if (secondaryStorageUrl == null) {
+ details += " because the URL passed: " + secondaryStorageUrl + " is invalid.";
+ return new CopyCmdAnswer(details);
+ }
+ try {
+ SR primaryStorageSR = this.hypervisorResource.getSRByNameLabelandHost(conn, primaryStorageNameLabel);
+ if (primaryStorageSR == null) {
+ throw new InternalErrorException("Could not create volume from snapshot because the primary Storage SR could not be created from the name label: "
+ + primaryStorageNameLabel);
+ }
+ // Get the absolute path of the snapshot on the secondary storage.
+ String snapshotInstallPath = snapshot.getPath();
+ int index = snapshotInstallPath.lastIndexOf(File.separator);
+ String snapshotName = snapshotInstallPath.substring(index + 1);
+
+ if (!snapshotName.startsWith("VHD-") && !snapshotName.endsWith(".vhd")) {
+ snapshotInstallPath = snapshotInstallPath + ".vhd";
+ }
+ URI snapshotURI = new URI(secondaryStorageUrl + File.separator + snapshotInstallPath);
+ String snapshotPath = snapshotURI.getHost() + ":" + snapshotURI.getPath();
+ String srUuid = primaryStorageSR.getUuid(conn);
+ volumeUUID = copy_vhd_from_secondarystorage(conn, snapshotPath, srUuid, wait);
+ result = true;
+ VDI volume = VDI.getByUuid(conn, volumeUUID);
+ VDI.Record vdir = volume.getRecord(conn);
+ VolumeObjectTO newVol = new VolumeObjectTO();
+ newVol.setPath(volumeUUID);
+ newVol.setSize(vdir.virtualSize);
+ return new CopyCmdAnswer(newVol);
+ } catch (XenAPIException e) {
+ details += " due to " + e.toString();
+ s_logger.warn(details, e);
+ } catch (Exception e) {
+ details += " due to " + e.getMessage();
+ s_logger.warn(details, e);
+ }
+ if (!result) {
+ // Is this logged at a higher level?
+ s_logger.error(details);
+ }
+
+ // In all cases return something.
+ return new CopyCmdAnswer(details);
+ }
+
+ @Override
+ public Answer deleteSnapshot(DeleteCommand cmd) {
+ SnapshotObjectTO snapshot = (SnapshotObjectTO)cmd.getData();
+ DataStoreTO store = snapshot.getDataStore();
+ if (store.getRole() == DataStoreRole.Primary) {
+ Connection conn = this.hypervisorResource.getConnection();
+ VDI snapshotVdi = getVDIbyUuid(conn, snapshot.getPath());
+ if (snapshotVdi == null) {
+ return new Answer(null);
+ }
+ String errMsg = null;
+ try {
+ this.deleteVDI(conn, snapshotVdi);
+ } catch (BadServerResponse e) {
+ s_logger.debug("delete snapshot failed:" + e.toString());
+ errMsg = e.toString();
+ } catch (XenAPIException e) {
+ s_logger.debug("delete snapshot failed:" + e.toString());
+ errMsg = e.toString();
+ } catch (XmlRpcException e) {
+ s_logger.debug("delete snapshot failed:" + e.toString());
+ errMsg = e.toString();
+ }
+ return new Answer(cmd, false, errMsg);
+ }
+ return new Answer(cmd, false, "unsupported storage type");
+ }
}