mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
fix snapshot
This commit is contained in:
parent
fb4036ece4
commit
ae902590d3
@ -74,6 +74,11 @@ public class SnapshotDataFactoryImpl implements SnapshotDataFactory {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SnapshotInfo getSnapshot(DataObject obj, DataStore store) {
|
public SnapshotInfo getSnapshot(DataObject obj, DataStore store) {
|
||||||
throw new CloudRuntimeException("not implemented yet");
|
SnapshotVO snapshot = snapshotDao.findByIdIncludingRemoved(obj.getId());
|
||||||
|
if (snapshot == null) {
|
||||||
|
throw new CloudRuntimeException("Can't find snapshot: " + obj.getId());
|
||||||
|
}
|
||||||
|
SnapshotObject so = SnapshotObject.getSnapshotObject(snapshot, store);
|
||||||
|
return so;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,7 +26,7 @@ SnapshotStateMachineManager {
|
|||||||
stateMachine.addTransition(Snapshot.State.Creating, Event.OperationFailed, Snapshot.State.Error);
|
stateMachine.addTransition(Snapshot.State.Creating, Event.OperationFailed, Snapshot.State.Error);
|
||||||
stateMachine.addTransition(Snapshot.State.CreatedOnPrimary, Event.BackupToSecondary, Snapshot.State.BackingUp);
|
stateMachine.addTransition(Snapshot.State.CreatedOnPrimary, Event.BackupToSecondary, Snapshot.State.BackingUp);
|
||||||
stateMachine.addTransition(Snapshot.State.BackingUp, Event.OperationSucceeded, Snapshot.State.BackedUp);
|
stateMachine.addTransition(Snapshot.State.BackingUp, Event.OperationSucceeded, Snapshot.State.BackedUp);
|
||||||
stateMachine.addTransition(Snapshot.State.BackingUp, Event.OperationFailed, Snapshot.State.Error);
|
stateMachine.addTransition(Snapshot.State.BackingUp, Event.OperationFailed, Snapshot.State.CreatedOnPrimary);
|
||||||
|
|
||||||
stateMachine.registerListener(new SnapshotStateListener());
|
stateMachine.registerListener(new SnapshotStateListener());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -180,7 +180,10 @@ public class AncientSnasphotStrategy implements SnapshotStrategy {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
SnapshotVO preSnapshotVO = this.snapshotMgr.getParentSnapshot(volume, snapshot);
|
SnapshotVO preSnapshotVO = this.snapshotMgr.getParentSnapshot(volume, snapshot);
|
||||||
String preSnapshotPath = preSnapshotVO.getPath();
|
String preSnapshotPath = null;
|
||||||
|
if (preSnapshotVO != null) {
|
||||||
|
preSnapshotPath = preSnapshotVO.getPath();
|
||||||
|
}
|
||||||
SnapshotVO snapshotVO = this.snapshotDao.findById(snapshot.getId());
|
SnapshotVO snapshotVO = this.snapshotDao.findById(snapshot.getId());
|
||||||
// The snapshot was successfully created
|
// The snapshot was successfully created
|
||||||
if (preSnapshotPath != null && preSnapshotPath.equals(result.getPath())) {
|
if (preSnapshotPath != null && preSnapshotPath.equals(result.getPath())) {
|
||||||
@ -238,6 +241,11 @@ public class AncientSnasphotStrategy implements SnapshotStrategy {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
s_logger.debug("Failed to create snapshot: ", e);
|
s_logger.debug("Failed to create snapshot: ", e);
|
||||||
snapResult.setResult(e.toString());
|
snapResult.setResult(e.toString());
|
||||||
|
try {
|
||||||
|
snapshot.processEvent(Snapshot.Event.OperationFailed);
|
||||||
|
} catch (NoTransitionException e1) {
|
||||||
|
s_logger.debug("Failed to change snapshot state: " + e1.toString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
future.complete(snapResult);
|
future.complete(snapResult);
|
||||||
@ -263,19 +271,30 @@ public class AncientSnasphotStrategy implements SnapshotStrategy {
|
|||||||
s_logger.debug("Failed to update snapshot state due to " + nte.getMessage());
|
s_logger.debug("Failed to update snapshot state due to " + nte.getMessage());
|
||||||
throw new CloudRuntimeException("Failed to update snapshot state due to " + nte.getMessage());
|
throw new CloudRuntimeException("Failed to update snapshot state due to " + nte.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
AsyncCallFuture<SnapshotResult> future = new AsyncCallFuture<SnapshotResult>();
|
AsyncCallFuture<SnapshotResult> future = new AsyncCallFuture<SnapshotResult>();
|
||||||
|
try {
|
||||||
|
CreateSnapshotContext<CommandResult> context = new CreateSnapshotContext<CommandResult>(
|
||||||
|
null, volume, snapshot, future);
|
||||||
|
AsyncCallbackDispatcher<AncientSnasphotStrategy, CreateCmdResult> caller = AsyncCallbackDispatcher
|
||||||
|
.create(this);
|
||||||
|
caller.setCallback(
|
||||||
|
caller.getTarget().createSnapshotAsyncCallback(null, null))
|
||||||
|
.setContext(context);
|
||||||
|
PrimaryDataStoreDriver primaryStore = (PrimaryDataStoreDriver)volume.getDataStore().getDriver();
|
||||||
|
primaryStore.takeSnapshot(snapshot, caller);
|
||||||
|
} catch (Exception e) {
|
||||||
|
s_logger.debug("Failed to take snapshot: " + snapshot.getId(), e);
|
||||||
|
try {
|
||||||
|
snapshot.processEvent(Snapshot.Event.OperationFailed);
|
||||||
|
} catch (NoTransitionException e1) {
|
||||||
|
s_logger.debug("Failed to change state for event: OperationFailed" , e);
|
||||||
|
}
|
||||||
|
throw new CloudRuntimeException("Failed to take snapshot" + snapshot.getId());
|
||||||
|
}
|
||||||
|
|
||||||
CreateSnapshotContext<CommandResult> context = new CreateSnapshotContext<CommandResult>(
|
|
||||||
null, volume, snapshot, future);
|
|
||||||
AsyncCallbackDispatcher<AncientSnasphotStrategy, CreateCmdResult> caller = AsyncCallbackDispatcher
|
|
||||||
.create(this);
|
|
||||||
caller.setCallback(
|
|
||||||
caller.getTarget().createSnapshotAsyncCallback(null, null))
|
|
||||||
.setContext(context);
|
|
||||||
PrimaryDataStoreDriver primaryStore = (PrimaryDataStoreDriver)volume.getDataStore().getDriver();
|
|
||||||
|
|
||||||
primaryStore.takeSnapshot(snapshot, caller);
|
|
||||||
SnapshotResult result;
|
SnapshotResult result;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
result = future.get();
|
result = future.get();
|
||||||
if (result.isFailed()) {
|
if (result.isFailed()) {
|
||||||
@ -390,6 +409,11 @@ public class AncientSnasphotStrategy implements SnapshotStrategy {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
s_logger.debug("Failed to copy snapshot", e);
|
s_logger.debug("Failed to copy snapshot", e);
|
||||||
result.setResult("Failed to copy snapshot:" +e.toString());
|
result.setResult("Failed to copy snapshot:" +e.toString());
|
||||||
|
try {
|
||||||
|
snapObj.processEvent(Snapshot.Event.OperationFailed);
|
||||||
|
} catch (NoTransitionException e1) {
|
||||||
|
s_logger.debug("Failed to change state: " + e1.toString());
|
||||||
|
}
|
||||||
future.complete(result);
|
future.complete(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -288,22 +288,31 @@ public class AncientPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver
|
|||||||
@Override
|
@Override
|
||||||
public void takeSnapshot(SnapshotInfo snapshot,
|
public void takeSnapshot(SnapshotInfo snapshot,
|
||||||
AsyncCompletionCallback<CreateCmdResult> callback) {
|
AsyncCompletionCallback<CreateCmdResult> callback) {
|
||||||
VolumeInfo volume = snapshot.getBaseVolume();
|
CreateCmdResult result = null;
|
||||||
String vmName = this.volumeMgr.getVmNameOnVolume(volume);
|
try {
|
||||||
SnapshotVO preSnapshotVO = this.snapshotMgr.getParentSnapshot(volume, snapshot);
|
VolumeInfo volume = snapshot.getBaseVolume();
|
||||||
StoragePool srcPool = (StoragePool)volume.getDataStore();
|
String vmName = this.volumeMgr.getVmNameOnVolume(volume);
|
||||||
|
SnapshotVO preSnapshotVO = this.snapshotMgr.getParentSnapshot(volume, snapshot);
|
||||||
|
String parentSnapshotPath = null;
|
||||||
|
if (preSnapshotVO != null) {
|
||||||
|
parentSnapshotPath = preSnapshotVO.getPath();
|
||||||
|
}
|
||||||
|
StoragePool srcPool = (StoragePool)volume.getDataStore();
|
||||||
|
|
||||||
ManageSnapshotCommand cmd = new ManageSnapshotCommand(snapshot.getId(), volume.getPath(), srcPool, preSnapshotVO.getPath(), snapshot.getName(), vmName);
|
ManageSnapshotCommand cmd = new ManageSnapshotCommand(snapshot.getId(), volume.getPath(), srcPool, parentSnapshotPath, snapshot.getName(), vmName);
|
||||||
|
|
||||||
ManageSnapshotAnswer answer = (ManageSnapshotAnswer) this.snapshotMgr.sendToPool(volume, cmd);
|
ManageSnapshotAnswer answer = (ManageSnapshotAnswer) this.snapshotMgr.sendToPool(volume, cmd);
|
||||||
|
|
||||||
CreateCmdResult result = null;
|
|
||||||
if ((answer != null) && answer.getResult()) {
|
|
||||||
result = new CreateCmdResult(answer.getSnapshotPath(), null);
|
|
||||||
} else {
|
|
||||||
result = new CreateCmdResult(null, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if ((answer != null) && answer.getResult()) {
|
||||||
|
result = new CreateCmdResult(answer.getSnapshotPath(), null);
|
||||||
|
} else {
|
||||||
|
result = new CreateCmdResult(null, null);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
s_logger.debug("Failed to take snapshot: " + snapshot.getId(), e);
|
||||||
|
result = new CreateCmdResult(null, null);
|
||||||
|
result.setResult(e.toString());
|
||||||
|
}
|
||||||
callback.complete(result);
|
callback.complete(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -351,6 +351,10 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
|
|||||||
throw new CloudRuntimeException("Can't find snapshot:" + snapshotId);
|
throw new CloudRuntimeException("Can't find snapshot:" + snapshotId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (snapshot.getState() == Snapshot.State.BackedUp) {
|
||||||
|
return snapshot;
|
||||||
|
}
|
||||||
|
|
||||||
SnapshotStrategy strategy = null;
|
SnapshotStrategy strategy = null;
|
||||||
for (SnapshotStrategy st : snapshotStrategies) {
|
for (SnapshotStrategy st : snapshotStrategies) {
|
||||||
if (st.canHandle(snapshot)) {
|
if (st.canHandle(snapshot)) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user