cloudstack-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From edi...@apache.org
Subject git commit: updated refs/heads/4.2-workplace to ba7f810
Date Thu, 05 Dec 2013 01:07:50 GMT
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 <sudison@gmail.com>
Authored: Wed Dec 4 17:07:26 2013 -0800
Committer: edison su <sudison@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;
                 }


Mime
View raw message