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/07/21 03:21:52 UTC

git commit: updated refs/heads/4.2 to 8c3f970

Updated Branches:
  refs/heads/4.2 ce6a5d718 -> 8c3f97043


CLOUDSTACK-2630: fix delta snashpt


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/8c3f9704
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/8c3f9704
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/8c3f9704

Branch: refs/heads/4.2
Commit: 8c3f970434e503288c38e89dad4f91cfd3ab894b
Parents: ce6a5d7
Author: Edison Su <su...@gmail.com>
Authored: Sat Jul 20 18:21:03 2013 -0700
Committer: Edison Su <su...@gmail.com>
Committed: Sat Jul 20 18:21:26 2013 -0700

----------------------------------------------------------------------
 .../storage/snapshot/SnapshotServiceImpl.java   | 23 +++++---
 .../SnapshotStateMachineManagerImpl.java        |  3 +-
 .../snapshot/XenserverSnapshotStrategy.java     | 61 ++++++++++++--------
 .../storage/image/BaseImageStoreDriverImpl.java |  3 +-
 .../xen/resource/XenServerStorageProcessor.java |  2 +-
 scripts/vm/hypervisor/xenserver/vmopsSnapshot   |  2 +-
 .../resource/NfsSecondaryStorageResource.java   | 21 +------
 utils/src/com/cloud/utils/SwiftUtil.java        | 35 +++++++++++
 8 files changed, 95 insertions(+), 55 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8c3f9704/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java
----------------------------------------------------------------------
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 81036d0..f8d9cbc 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
@@ -334,18 +334,25 @@ public class SnapshotServiceImpl implements SnapshotService {
 
     protected Void deleteSnapshotCallback(AsyncCallbackDispatcher<SnapshotServiceImpl, CommandResult> callback,
             DeleteSnapshotContext<CommandResult> context) {
+
         CommandResult result = callback.getResult();
         AsyncCallFuture<SnapshotResult> future = context.future;
         SnapshotInfo snapshot = context.snapshot;
-        if (result.isFailed()) {
-            s_logger.debug("delete snapshot failed" + result.getResult());
-            snapshot.processEvent(ObjectInDataStoreStateMachine.Event.OperationFailed);
-            SnapshotResult res = new SnapshotResult(context.snapshot, null);
-            future.complete(res);
-            return null;
+        SnapshotResult res = null;
+        try {
+            if (result.isFailed()) {
+                s_logger.debug("delete snapshot failed" + result.getResult());
+                snapshot.processEvent(ObjectInDataStoreStateMachine.Event.OperationFailed);
+                res = new SnapshotResult(context.snapshot, null);
+                res.setResult(result.getResult());
+            } else {
+                snapshot.processEvent(ObjectInDataStoreStateMachine.Event.OperationSuccessed);
+                res = new SnapshotResult(context.snapshot, null);
+            }
+        } catch (Exception e) {
+            s_logger.debug("Failed to in deleteSnapshotCallback", e);
+            res.setResult(e.toString());
         }
-        snapshot.processEvent(ObjectInDataStoreStateMachine.Event.OperationSuccessed);
-        SnapshotResult res = new SnapshotResult(context.snapshot, null);
         future.complete(res);
         return null;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8c3f9704/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotStateMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotStateMachineManagerImpl.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotStateMachineManagerImpl.java
index c756ddb..555dcb8 100644
--- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotStateMachineManagerImpl.java
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotStateMachineManagerImpl.java
@@ -42,6 +42,7 @@ public class SnapshotStateMachineManagerImpl implements SnapshotStateMachineMana
         stateMachine.addTransition(Snapshot.State.Creating, Event.OperationNotPerformed, Snapshot.State.BackedUp);
         stateMachine.addTransition(Snapshot.State.Creating, Event.OperationFailed, Snapshot.State.Error);
         stateMachine.addTransition(Snapshot.State.CreatedOnPrimary, Event.BackupToSecondary, Snapshot.State.BackingUp);
+        stateMachine.addTransition(State.CreatedOnPrimary, Event.OperationNotPerformed, State.BackedUp);
         stateMachine.addTransition(Snapshot.State.BackingUp, Event.OperationSucceeded, Snapshot.State.BackedUp);
         stateMachine.addTransition(Snapshot.State.BackingUp, Event.OperationFailed, Snapshot.State.CreatedOnPrimary);
         stateMachine.addTransition(Snapshot.State.BackedUp, Event.DestroyRequested, Snapshot.State.Destroying);
@@ -49,7 +50,7 @@ public class SnapshotStateMachineManagerImpl implements SnapshotStateMachineMana
         stateMachine.addTransition(Snapshot.State.Copying, Event.OperationSucceeded, Snapshot.State.BackedUp);
         stateMachine.addTransition(Snapshot.State.Copying, Event.OperationFailed, Snapshot.State.BackedUp);
         stateMachine.addTransition(Snapshot.State.Destroying, Event.OperationSucceeded, Snapshot.State.Destroyed);
-        stateMachine.addTransition(Snapshot.State.Destroying, Event.OperationFailed, Snapshot.State.Error);
+        stateMachine.addTransition(Snapshot.State.Destroying, Event.OperationFailed, State.BackedUp);
 
         stateMachine.registerListener(new SnapshotStateListener());
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8c3f9704/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
index e30972d..79f7d65 100644
--- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
+++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java
@@ -127,21 +127,23 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
         return this.snapshotSvr.backupSnapshot(snapshot);
     }
 
-    protected void deleteSnapshotChain(SnapshotInfo snapshot) {
-        while (snapshot != null) {
+    protected boolean deleteSnapshotChain(SnapshotInfo snapshot) {
+        s_logger.debug("delete snapshot chain for snapshot: " + snapshot.getId());
+        boolean result = false;
+        while (snapshot != null && (snapshot.getState() == Snapshot.State.Destroying || snapshot.getState()
+                == Snapshot.State.Destroyed || snapshot.getState() == Snapshot.State.Error)) {
             SnapshotInfo child = snapshot.getChild();
-            SnapshotInfo parent = snapshot.getParent();
-            if (child == null) {
-                if (parent == null || !parent.getPath().equalsIgnoreCase(snapshot.getPath())) {
-                    this.snapshotSvr.deleteSnapshot(snapshot);
-                    snapshot = parent;
-                    continue;
-                }
-                break;
-            } else {
+
+            if (child != null) {
+                s_logger.debug("the snapshot has child, can't delete it on the storage");
                 break;
             }
+            s_logger.debug("Snapshot: " + snapshot.getId() + " doesn't have children, so it's ok to delete it and its parents");
+            SnapshotInfo parent = snapshot.getParent();
+            result = this.snapshotSvr.deleteSnapshot(snapshot);
+            snapshot = parent;
         }
+        return result;
     }
 
     @Override
@@ -151,36 +153,47 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
             return true;
         }
 
+
+        if (snapshotVO.getState() == Snapshot.State.CreatedOnPrimary) {
+            s_logger.debug("delete snapshot on primary storage:");
+            snapshotVO.setState(Snapshot.State.Destroyed);
+            snapshotDao.update(snapshotId, snapshotVO);
+            return true;
+        }
+
         if (!Snapshot.State.BackedUp.equals(snapshotVO.getState())) {
             throw new InvalidParameterValueException("Can't delete snapshotshot " + snapshotId
                     + " due to it is not in BackedUp Status");
         }
 
-        if (s_logger.isDebugEnabled()) {
-            s_logger.debug("Calling deleteSnapshot for snapshotId: " + snapshotId);
-        }
-
         // firt mark the snapshot as destroyed, so that ui can't see it, but we
         // may not destroy the snapshot on the storage, as other snaphosts may
         // depend on it.
-        SnapshotInfo snapshotOnPrimary = this.snapshotDataFactory.getSnapshot(snapshotId, DataStoreRole.Primary);
-        SnapshotObject obj = (SnapshotObject) snapshotOnPrimary;
+        SnapshotInfo snapshotOnImage = this.snapshotDataFactory.getSnapshot(snapshotId, DataStoreRole.Image);
+        if (snapshotOnImage == null) {
+            s_logger.debug("Can't find snapshot on backup storage, delete it in db");
+            snapshotDao.remove(snapshotId);
+        }
+
+        SnapshotObject obj = (SnapshotObject) snapshotOnImage;
         try {
             obj.processEvent(Snapshot.Event.DestroyRequested);
         } catch (NoTransitionException e) {
-            s_logger.debug("Failed to destroy snapshot: " + e.toString());
+            s_logger.debug("Failed to set the state to destroying: ", e);
             return false;
         }
 
         try {
-            SnapshotInfo snapshotOnImage = this.snapshotDataFactory.getSnapshot(snapshotId, DataStoreRole.Image);
-            if (snapshotOnImage != null) {
-                deleteSnapshotChain(snapshotOnImage);
-            }
-
+            boolean result = deleteSnapshotChain(snapshotOnImage);
             obj.processEvent(Snapshot.Event.OperationSucceeded);
+            if (result) {
+                //snapshot is deleted on backup storage, need to delete it on primary storage
+                SnapshotDataStoreVO snapshotOnPrimary = snapshotStoreDao.findBySnapshot(snapshotId, DataStoreRole.Primary);
+                snapshotOnPrimary.setState(State.Destroyed);
+                snapshotStoreDao.update(snapshotOnPrimary.getId(), snapshotOnPrimary);
+            }
         } catch (Exception e) {
-            s_logger.debug("Failed to delete snapshot: " + e.toString());
+            s_logger.debug("Failed to delete snapshot: ", e);
             try {
                 obj.processEvent(Snapshot.Event.OperationFailed);
             } catch (NoTransitionException e1) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8c3f9704/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java
index a415c9f..e2fc8b7 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java
@@ -219,10 +219,9 @@ public abstract class BaseImageStoreDriverImpl implements ImageStoreDriver {
 
     @Override
     public void deleteAsync(DataStore dataStore, DataObject data, AsyncCompletionCallback<CommandResult> callback) {
-        DeleteCommand cmd = new DeleteCommand(data.getTO());
-
         CommandResult result = new CommandResult();
         try {
+            DeleteCommand cmd = new DeleteCommand(data.getTO());
             EndPoint ep = _epSelector.select(data);
             Answer answer = ep.sendMessage(cmd);
             if (answer != null && !answer.getResult()) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8c3f9704/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 17a4856..e88d6a5 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
@@ -1160,7 +1160,7 @@ public class XenServerStorageProcessor implements StorageProcessor {
         String backupUuid = UUID.randomUUID().toString();
         String results = hypervisorResource.callHostPluginAsync(conn, "vmopsSnapshot", "backupSnapshot", wait,
                 "primaryStorageSRUuid", primaryStorageSRUuid, "path", path, "secondaryStorageMountPath", secondaryStorageMountPath,
-                "snapshotUuid", snapshotUuid, "prevBackupUuid", prevBackupUuid, "backupUuid", backupUuid, "isISCSI", isISCSI.toString(), "localMountPath", localMountPoint);
+                "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

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8c3f9704/scripts/vm/hypervisor/xenserver/vmopsSnapshot
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/vmopsSnapshot b/scripts/vm/hypervisor/xenserver/vmopsSnapshot
index 9673986..a4b0662 100755
--- a/scripts/vm/hypervisor/xenserver/vmopsSnapshot
+++ b/scripts/vm/hypervisor/xenserver/vmopsSnapshot
@@ -504,7 +504,7 @@ def backupSnapshot(session, args):
     # on it.
     backupsDir = mountSnapshotsDir(secondaryStorageMountPath, localMountPoint, path)
     util.SMlog("Backups dir " + backupsDir)
-
+    prevBackupUuid = prevBackupUuid.split("/")[-1]
     # Check existence of snapshot on primary storage
     isfile(baseCopyPath, isISCSI)
     if prevBackupUuid:

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8c3f9704/services/secondary-storage/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java
----------------------------------------------------------------------
diff --git a/services/secondary-storage/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java b/services/secondary-storage/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java
index a82714b..5318e09 100755
--- a/services/secondary-storage/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java
+++ b/services/secondary-storage/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java
@@ -1429,25 +1429,10 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
                 return new Answer(cmd, false, errorMessage);
             }
         } else if (dstore instanceof SwiftTO) {
+            SwiftTO swiftTO = (SwiftTO)dstore;
             String path = obj.getPath();
-            String filename = StringUtils.substringAfterLast(path, "/"); // assuming
-            // that
-            // the
-            // filename
-            // is
-            // the
-            // last
-            // section
-            // in
-            // the
-            // path
-            String volumeId = StringUtils.substringAfterLast(StringUtils.substringBeforeLast(path, "/"), "/");
-            String result = swiftDelete((SwiftTO) dstore, "V-" + volumeId, filename);
-            if (result != null) {
-                String errMsg = "failed to delete snapshot " + filename + " , err=" + result;
-                s_logger.warn(errMsg);
-                return new Answer(cmd, false, errMsg);
-            }
+            SwiftUtil.deleteObject(swiftTO, path);
+
             return new Answer(cmd, true, "Deleted snapshot " + path + " from swift");
         } else {
             return new Answer(cmd, false, "Unsupported image data store: " + dstore);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8c3f9704/utils/src/com/cloud/utils/SwiftUtil.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/SwiftUtil.java b/utils/src/com/cloud/utils/SwiftUtil.java
index 85da505..8b816b9 100644
--- a/utils/src/com/cloud/utils/SwiftUtil.java
+++ b/utils/src/com/cloud/utils/SwiftUtil.java
@@ -203,4 +203,39 @@ public class SwiftUtil {
         }
         return null;
     }
+
+    public static String[] splitSwiftPath(String path) {
+        int index = path.indexOf(File.separator);
+        if (index == -1) {
+            return null;
+        }
+        String[] paths = new String[2];
+        paths[0] = path.substring(0, index);
+        paths[1] = path.substring(index + 1);
+        return paths;
+    }
+
+    public static boolean deleteObject(SwiftClientCfg cfg, String path) {
+        Script command = new Script("/bin/bash", logger);
+        command.add("-c");
+
+        String[] paths = splitSwiftPath(path);
+        if (paths == null) {
+            return false;
+        }
+        String container = paths[0];
+        String objectName = paths[1];
+
+        StringBuilder swiftCmdBuilder = buildSwiftCmd(cfg);
+        swiftCmdBuilder.append(" delete ");
+        swiftCmdBuilder.append(container);
+        swiftCmdBuilder.append(" ");
+        swiftCmdBuilder.append(objectName);
+
+
+        command.add(swiftCmdBuilder.toString());
+        OutputInterpreter.AllLinesParser parser = new OutputInterpreter.AllLinesParser();
+        String result = command.execute(parser);
+        return true;
+    }
 }