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;
+ }
}