You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ed...@apache.org on 2013/12/05 02:07:50 UTC
git commit: updated refs/heads/4.2-workplace to ba7f810
Updated Branches:
refs/heads/4.2-workplace d17e17a22 -> ba7f810fe
Add vdi.copyV2Async to handle new way of copy vdi
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/ba7f810f
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/ba7f810f
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/ba7f810f
Branch: refs/heads/4.2-workplace
Commit: ba7f810fe6bc667cfea8e12c927ce49b792e6a15
Parents: d17e17a
Author: edison su <su...@gmail.com>
Authored: Wed Dec 4 17:07:26 2013 -0800
Committer: edison su <su...@gmail.com>
Committed: Wed Dec 4 17:07:26 2013 -0800
----------------------------------------------------------------------
.../src/com/xensource/xenapi/VDI.java | 2 +-
.../xen/resource/CitrixResourceBase.java | 2 +-
.../xen/resource/XenServerStorageProcessor.java | 118 ++++++++++++-------
3 files changed, 76 insertions(+), 46 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ba7f810f/deps/XenServerJava/src/com/xensource/xenapi/VDI.java
----------------------------------------------------------------------
diff --git a/deps/XenServerJava/src/com/xensource/xenapi/VDI.java b/deps/XenServerJava/src/com/xensource/xenapi/VDI.java
index bc2beb1..5f7b050 100644
--- a/deps/XenServerJava/src/com/xensource/xenapi/VDI.java
+++ b/deps/XenServerJava/src/com/xensource/xenapi/VDI.java
@@ -1614,7 +1614,7 @@ public class VDI extends XenAPIObject {
return Types.toTask(result);
}
- public Task copyDaveAsync(Connection c, SR sr, Map<String, String> params) throws BadServerResponse, XenAPIException, XmlRpcException {
+ public Task copyV2Async(Connection c, SR sr, Map<String, Object> params) throws BadServerResponse, XenAPIException, XmlRpcException {
String method_call = "Async.VDI.copy";
String session = c.getSessionReference();
Object[] method_params = {Marshalling.toXMLRPC(session), Marshalling.toXMLRPC(ref), Marshalling.toXMLRPC(sr), Marshalling.toXMLRPC(params)};
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ba7f810f/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index 03e59df..2050225 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -3983,7 +3983,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
Map<String,String> params = new HashMap<String, String>();
params.put("base-src", snashotPaPaUuid);
params.put("base-dst", prevBackupUuid);
- task = snapshotvdi.copyDaveAsync(conn, ssSR, params);
+ //task = snapshotvdi.copyDaveAsync(conn, ssSR, params);
// poll every 1 seconds ,
waitForTask(conn, task, 1000, wait * 1000);
checkForSuccess(conn, task);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ba7f810f/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 f5d5256..69a13ed 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
@@ -29,22 +29,14 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
+import java.util.concurrent.TimeoutException;
+import com.xensource.xenapi.*;
import org.apache.log4j.Logger;
import org.apache.xmlrpc.XmlRpcException;
-import com.xensource.xenapi.Connection;
-import com.xensource.xenapi.Host;
-import com.xensource.xenapi.PBD;
-import com.xensource.xenapi.Pool;
-import com.xensource.xenapi.SR;
-import com.xensource.xenapi.Types;
import com.xensource.xenapi.Types.BadServerResponse;
import com.xensource.xenapi.Types.XenAPIException;
-import com.xensource.xenapi.VBD;
-import com.xensource.xenapi.VDI;
-import com.xensource.xenapi.VM;
-import com.xensource.xenapi.VMGuestMetrics;
import org.apache.cloudstack.storage.command.AttachAnswer;
import org.apache.cloudstack.storage.command.AttachCommand;
@@ -1109,46 +1101,84 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
- protected String backupSnapshot(Connection conn, String primaryStorageSRUuid, String localMountPoint, String path, String secondaryStorageMountPath, String snapshotUuid, String prevBackupUuid, Boolean isISCSI, int wait) {
- String backupSnapshotUuid = null;
-
+ protected String backupSnapshot(Connection conn, String primaryStorageSRUuid, String localMountPoint, String path, String secondaryStorageMountPath, String snapshotUuid, String prevBackupUuid, String prevSnapshotUuid, Boolean isISCSI, int wait) {
+ String errMsg = null;
+ boolean mounted = false;
+ boolean filesrcreated = false;
+ boolean copied = false;
if (prevBackupUuid == null) {
prevBackupUuid = "";
}
+ SR ssSR = null;
+ String localDir = "/var/cloud_mount/" + UUID.randomUUID().toString();
+ String remoteDir = secondaryStorageMountPath + File.separator + path;
- // Each argument is put in a separate line for readability.
- // Using more lines does not harm the environment.
- String backupUuid = UUID.randomUUID().toString();
- String results = hypervisorResource.callHostPluginAsync(conn, "cloud-plugin-snapshot", "backupSnapshot", wait,
- "primaryStorageSRUuid", primaryStorageSRUuid, "path", path, "secondaryStorageMountPath", secondaryStorageMountPath,
- "snapshotUuid", snapshotUuid, "prevBackupUuid", prevBackupUuid, "backupUuid", backupUuid, "isISCSI", isISCSI.toString(), "localMountPoint", localMountPoint);
- String errMsg = null;
- if (results == null || results.isEmpty()) {
- errMsg = "Could not copy backupUuid: " + backupSnapshotUuid
- + " from primary storage " + primaryStorageSRUuid + " to secondary storage "
- + secondaryStorageMountPath + " due to null";
- } else {
+ try {
+ String results = hypervisorResource.callHostPluginAsync(conn, "cloud-plugin-snapshot", "mountNfsSecondaryStorage", wait,
+ "localDir", localDir, "remoteDir", remoteDir);
+ if (results == null || results.isEmpty()) {
+ errMsg = "Could not mount secondary storage " + remoteDir;
+ s_logger.warn(errMsg);
+ throw new CloudRuntimeException(errMsg);
+ }
+ mounted = true;
- String[] tmp = results.split("#");
- String status = tmp[0];
- backupSnapshotUuid = tmp[1];
- // status == "1" if and only if backupSnapshotUuid != null
- // So we don't rely on status value but return backupSnapshotUuid as an
- // indicator of success.
- if (status != null && status.equalsIgnoreCase("1") && backupSnapshotUuid != null) {
- s_logger.debug("Successfully copied backupUuid: " + backupSnapshotUuid
- + " to secondary storage");
- return backupSnapshotUuid;
- } else {
- errMsg = "Could not copy backupUuid: " + backupSnapshotUuid
- + " from primary storage " + primaryStorageSRUuid + " to secondary storage "
- + secondaryStorageMountPath + " due to " + tmp[1];
+ ssSR = hypervisorResource.createFileSR(conn, localDir, remoteDir);
+ filesrcreated = true;
+
+ VDI snapshotvdi = VDI.getByUuid(conn, snapshotUuid);
+ Task task = null;
+ if (wait == 0) {
+ wait = 2 * 60 * 60;
+ }
+ VDI dvdi = null;
+ try {
+ Map<String,Object> params = new HashMap<String, Object>();
+ if (prevSnapshotUuid != null) {
+ VDI previousSnapshotVdi = VDI.getByUuid(conn,prevSnapshotUuid);
+ params.put("base-vdi", previousSnapshotVdi);
+ }
+ task = snapshotvdi.copyV2Async(conn, ssSR, params);
+ // poll every 1 seconds ,
+ hypervisorResource.waitForTask(conn, task, 1000, wait * 1000);
+ hypervisorResource.checkForSuccess(conn, task);
+ dvdi = Types.toVDI(task, conn);
+ copied = true;
+ } catch (TimeoutException e) {
+ throw new CloudRuntimeException(e.toString());
+ } finally {
+ if (task != null) {
+ try {
+ task.destroy(conn);
+ } catch (Exception e1) {
+ s_logger.warn("unable to destroy task(" + task.toString() + ") on host("
+ + ") due to ", e1);
+ }
+ }
+ }
+ String backupUuid = dvdi.getUuid(conn);
+ return backupUuid;
+ } catch (Exception e) {
+ String msg = "Exception in backupsnapshot stage due to " + e.toString();
+ s_logger.debug(msg);
+ throw new CloudRuntimeException(msg, e);
+ } finally {
+ try {
+ if (filesrcreated && ssSR != null) {
+ ssSR.forget(conn);
+ }
+ if (mounted) {
+ String results = hypervisorResource.callHostPluginAsync(conn, "cloud-plugin-snapshot", "umountNfsSecondaryStorage",
+ wait, "localDir", localDir);
+ if (results == null || results.isEmpty()) {
+ errMsg = "Could not umount secondary storage " + remoteDir + " on host ";
+ s_logger.debug(errMsg);
+ }
+ }
+ } catch (Exception e) {
+ s_logger.debug("Exception in backupsnapshot cleanup stage due to " + e.toString());
}
}
- String source = backupUuid + ".vhd";
- hypervisorResource.killCopyProcess(conn, source);
- s_logger.warn(errMsg);
- throw new CloudRuntimeException(errMsg);
}
private boolean destroySnapshotOnPrimaryStorageExceptThis(Connection conn, String volumeUuid, String avoidSnapshotUuid){
@@ -1310,7 +1340,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
}
} else {
snapshotBackupUuid = backupSnapshot(conn, primaryStorageSRUuid, localMountPoint, folder,
- secondaryStorageMountPath, snapshotUuid, prevBackupUuid, isISCSI, wait);
+ secondaryStorageMountPath, snapshotUuid, prevBackupUuid, prevSnapshotUuid, isISCSI, wait);
finalPath = folder + File.separator + snapshotBackupUuid;
}