Search in sources :

Example 1 with SnapshotResult

use of com.cloud.engine.subsystem.api.storage.SnapshotResult in project cosmic by MissionCriticalCloud.

the class SnapshotServiceImpl method createSnapshotAsyncCallback.

protected Void createSnapshotAsyncCallback(final AsyncCallbackDispatcher<SnapshotServiceImpl, CreateCmdResult> callback, final CreateSnapshotContext<CreateCmdResult> context) {
    final CreateCmdResult result = callback.getResult();
    final SnapshotObject snapshot = (SnapshotObject) context.snapshot;
    final AsyncCallFuture<SnapshotResult> future = context.future;
    final SnapshotResult snapResult = new SnapshotResult(snapshot, result.getAnswer());
    if (result.isFailed()) {
        s_logger.debug("create snapshot " + context.snapshot.getName() + " failed: " + result.getResult());
        try {
            snapshot.processEvent(Snapshot.Event.OperationFailed);
            snapshot.processEvent(Event.OperationFailed);
        } catch (final Exception e) {
            s_logger.debug("Failed to update snapshot state due to " + e.getMessage());
        }
        snapResult.setResult(result.getResult());
        future.complete(snapResult);
        return null;
    }
    try {
        snapshot.processEvent(Event.OperationSuccessed, result.getAnswer());
        snapshot.processEvent(Snapshot.Event.OperationSucceeded);
    } catch (final Exception e) {
        s_logger.debug("Failed to create snapshot: ", e);
        snapResult.setResult(e.toString());
        try {
            snapshot.processEvent(Snapshot.Event.OperationFailed);
        } catch (final NoTransitionException e1) {
            s_logger.debug("Failed to change snapshot state: " + e1.toString());
        }
    }
    future.complete(snapResult);
    return null;
}
Also used : SnapshotResult(com.cloud.engine.subsystem.api.storage.SnapshotResult) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) CreateCmdResult(com.cloud.engine.subsystem.api.storage.CreateCmdResult) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) ExecutionException(java.util.concurrent.ExecutionException)

Example 2 with SnapshotResult

use of com.cloud.engine.subsystem.api.storage.SnapshotResult in project cosmic by MissionCriticalCloud.

the class SnapshotServiceImpl method syncSnapshotToRegionStore.

// push one individual snapshots currently on cache store to region store if it is not there already
private void syncSnapshotToRegionStore(final long snapshotId, final DataStore store) {
    // if snapshot is already on region wide object store, check if it is really downloaded there (by checking install_path). Sync snapshot to region
    // wide store if it is not there physically.
    final SnapshotInfo snapOnStore = _snapshotFactory.getSnapshot(snapshotId, store);
    if (snapOnStore == null) {
        throw new CloudRuntimeException("Cannot find an entry in snapshot_store_ref for snapshot " + snapshotId + " on region store: " + store.getName());
    }
    if (snapOnStore.getPath() == null || snapOnStore.getPath().length() == 0) {
        if (s_logger.isDebugEnabled()) {
            s_logger.debug("sync snapshot " + snapshotId + " from cache to object store...");
        }
        // snapshot is not on region store yet, sync to region store
        final SnapshotInfo srcSnapshot = _snapshotFactory.getReadySnapshotOnCache(snapshotId);
        if (srcSnapshot == null) {
            throw new CloudRuntimeException("Cannot find snapshot " + snapshotId + "  on cache store");
        }
        final AsyncCallFuture<SnapshotResult> future = syncToRegionStoreAsync(srcSnapshot, store);
        try {
            final SnapshotResult result = future.get();
            if (result.isFailed()) {
                throw new CloudRuntimeException("sync snapshot from cache to region wide store failed for image store " + store.getName() + ":" + result.getResult());
            }
            // reduce reference count for template on cache, so it can recycled by schedule
            _cacheMgr.releaseCacheObject(srcSnapshot);
        } catch (final Exception ex) {
            throw new CloudRuntimeException("sync snapshot from cache to region wide store failed for image store " + store.getName());
        }
    }
}
Also used : SnapshotInfo(com.cloud.engine.subsystem.api.storage.SnapshotInfo) SnapshotResult(com.cloud.engine.subsystem.api.storage.SnapshotResult) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) ExecutionException(java.util.concurrent.ExecutionException)

Example 3 with SnapshotResult

use of com.cloud.engine.subsystem.api.storage.SnapshotResult in project cosmic by MissionCriticalCloud.

the class SnapshotServiceImpl method takeSnapshot.

@Override
public SnapshotResult takeSnapshot(final SnapshotInfo snap) {
    final SnapshotObject snapshot = (SnapshotObject) snap;
    SnapshotObject snapshotOnPrimary = null;
    try {
        snapshotOnPrimary = (SnapshotObject) snap.getDataStore().create(snapshot);
    } catch (final Exception e) {
        s_logger.debug("Failed to create snapshot state on data store due to " + e.getMessage());
        throw new CloudRuntimeException(e);
    }
    try {
        snapshotOnPrimary.processEvent(Snapshot.Event.CreateRequested);
    } catch (final NoTransitionException e) {
        s_logger.debug("Failed to change snapshot state: " + e.toString());
        throw new CloudRuntimeException(e);
    }
    try {
        snapshotOnPrimary.processEvent(Event.CreateOnlyRequested);
    } catch (final Exception e) {
        s_logger.debug("Failed to change snapshot state: " + e.toString());
        try {
            snapshotOnPrimary.processEvent(Snapshot.Event.OperationFailed);
        } catch (final NoTransitionException e1) {
            s_logger.debug("Failed to change snapshot state: " + e1.toString());
        }
        throw new CloudRuntimeException(e);
    }
    final AsyncCallFuture<SnapshotResult> future = new AsyncCallFuture<>();
    try {
        final CreateSnapshotContext<CommandResult> context = new CreateSnapshotContext<>(null, snap.getBaseVolume(), snapshotOnPrimary, future);
        final AsyncCallbackDispatcher<SnapshotServiceImpl, CreateCmdResult> caller = AsyncCallbackDispatcher.create(this);
        caller.setCallback(caller.getTarget().createSnapshotAsyncCallback(null, null)).setContext(context);
        final PrimaryDataStoreDriver primaryStore = (PrimaryDataStoreDriver) snapshotOnPrimary.getDataStore().getDriver();
        primaryStore.takeSnapshot(snapshot, caller);
    } catch (final Exception e) {
        s_logger.debug("Failed to take snapshot: " + snapshot.getId(), e);
        try {
            snapshot.processEvent(Snapshot.Event.OperationFailed);
            snapshot.processEvent(Event.OperationFailed);
        } catch (final NoTransitionException e1) {
            s_logger.debug("Failed to change state for event: OperationFailed", e);
        }
        throw new CloudRuntimeException("Failed to take snapshot" + snapshot.getId());
    }
    final SnapshotResult result;
    try {
        result = future.get();
        return result;
    } catch (final InterruptedException e) {
        s_logger.debug("Failed to create snapshot", e);
        throw new CloudRuntimeException("Failed to create snapshot", e);
    } catch (final ExecutionException e) {
        s_logger.debug("Failed to create snapshot", e);
        throw new CloudRuntimeException("Failed to create snapshot", e);
    }
}
Also used : SnapshotResult(com.cloud.engine.subsystem.api.storage.SnapshotResult) CreateCmdResult(com.cloud.engine.subsystem.api.storage.CreateCmdResult) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) ExecutionException(java.util.concurrent.ExecutionException) CommandResult(com.cloud.storage.command.CommandResult) CopyCommandResult(com.cloud.engine.subsystem.api.storage.CopyCommandResult) AsyncCallFuture(com.cloud.framework.async.AsyncCallFuture) PrimaryDataStoreDriver(com.cloud.engine.subsystem.api.storage.PrimaryDataStoreDriver) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) ExecutionException(java.util.concurrent.ExecutionException)

Example 4 with SnapshotResult

use of com.cloud.engine.subsystem.api.storage.SnapshotResult in project cosmic by MissionCriticalCloud.

the class StorageSystemSnapshotStrategy method takeSnapshot.

@Override
@DB
public SnapshotInfo takeSnapshot(final SnapshotInfo snapshotInfo) {
    final VolumeInfo volumeInfo = snapshotInfo.getBaseVolume();
    if (volumeInfo.getFormat() != ImageFormat.VHD) {
        throw new CloudRuntimeException("Only the " + ImageFormat.VHD.toString() + " image type is currently supported.");
    }
    final SnapshotVO snapshotVO = _snapshotDao.acquireInLockTable(snapshotInfo.getId());
    if (snapshotVO == null) {
        throw new CloudRuntimeException("Failed to acquire lock on the following snapshot: " + snapshotInfo.getId());
    }
    SnapshotResult result = null;
    try {
        volumeInfo.stateTransit(Volume.Event.SnapshotRequested);
        // tell the storage driver to create a back-end volume (eventually used to create a new SR on and to copy the VM snapshot VDI to)
        result = snapshotSvr.takeSnapshot(snapshotInfo);
        if (result.isFailed()) {
            s_logger.debug("Failed to take a snapshot: " + result.getResult());
            throw new CloudRuntimeException(result.getResult());
        }
        // send a command to XenServer to create a VM snapshot on the applicable SR (get back the VDI UUID of the VM snapshot)
        performSnapshotAndCopyOnHostSide(volumeInfo, snapshotInfo);
        markAsBackedUp((SnapshotObject) result.getSnashot());
    } finally {
        if (result != null && result.isSuccess()) {
            volumeInfo.stateTransit(Volume.Event.OperationSucceeded);
        } else {
            volumeInfo.stateTransit(Volume.Event.OperationFailed);
        }
        _snapshotDao.releaseFromLockTable(snapshotInfo.getId());
    }
    return snapshotInfo;
}
Also used : SnapshotVO(com.cloud.storage.SnapshotVO) SnapshotResult(com.cloud.engine.subsystem.api.storage.SnapshotResult) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) VolumeInfo(com.cloud.engine.subsystem.api.storage.VolumeInfo) DB(com.cloud.utils.db.DB)

Example 5 with SnapshotResult

use of com.cloud.engine.subsystem.api.storage.SnapshotResult in project cosmic by MissionCriticalCloud.

the class XenserverSnapshotStrategy method takeSnapshot.

@Override
@DB
public SnapshotInfo takeSnapshot(SnapshotInfo snapshot) {
    final Object payload = snapshot.getPayload();
    if (payload != null) {
        final CreateSnapshotPayload createSnapshotPayload = (CreateSnapshotPayload) payload;
        if (createSnapshotPayload.getQuiescevm()) {
            throw new InvalidParameterValueException("can't handle quiescevm equal true for volume snapshot");
        }
    }
    final SnapshotVO snapshotVO = snapshotDao.acquireInLockTable(snapshot.getId());
    if (snapshotVO == null) {
        throw new CloudRuntimeException("Failed to get lock on snapshot:" + snapshot.getId());
    }
    try {
        final VolumeInfo volumeInfo = snapshot.getBaseVolume();
        volumeInfo.stateTransit(Volume.Event.SnapshotRequested);
        SnapshotResult result = null;
        try {
            result = snapshotSvr.takeSnapshot(snapshot);
            if (result.isFailed()) {
                s_logger.debug("Failed to take snapshot: " + result.getResult());
                throw new CloudRuntimeException(result.getResult());
            }
        } finally {
            if (result != null && result.isSuccess()) {
                volumeInfo.stateTransit(Volume.Event.OperationSucceeded);
            } else {
                volumeInfo.stateTransit(Volume.Event.OperationFailed);
            }
        }
        snapshot = result.getSnashot();
        final DataStore primaryStore = snapshot.getDataStore();
        final boolean backupFlag = Boolean.parseBoolean(configDao.getValue(Config.BackupSnapshotAfterTakingSnapshot.toString()));
        final SnapshotInfo backupedSnapshot;
        if (backupFlag) {
            backupedSnapshot = backupSnapshot(snapshot);
        } else {
            // Fake it to get the transitions to fire in the proper order
            s_logger.debug("skipping backup of snapshot due to configuration " + Config.BackupSnapshotAfterTakingSnapshot.toString());
            final SnapshotObject snapObj = (SnapshotObject) snapshot;
            try {
                snapObj.processEvent(Snapshot.Event.OperationNotPerformed);
            } catch (final NoTransitionException e) {
                s_logger.debug("Failed to change state: " + snapshot.getId() + ": " + e.toString());
                throw new CloudRuntimeException(e.toString());
            }
            backupedSnapshot = snapshot;
        }
        try {
            final SnapshotInfo parent = snapshot.getParent();
            if (backupedSnapshot != null && parent != null) {
                Long parentSnapshotId = parent.getId();
                while (parentSnapshotId != null && parentSnapshotId != 0L) {
                    final SnapshotDataStoreVO snapshotDataStoreVO = snapshotStoreDao.findByStoreSnapshot(primaryStore.getRole(), primaryStore.getId(), parentSnapshotId);
                    if (snapshotDataStoreVO != null) {
                        parentSnapshotId = snapshotDataStoreVO.getParentSnapshotId();
                        snapshotStoreDao.remove(snapshotDataStoreVO.getId());
                    } else {
                        parentSnapshotId = null;
                    }
                }
                final SnapshotDataStoreVO snapshotDataStoreVO = snapshotStoreDao.findByStoreSnapshot(primaryStore.getRole(), primaryStore.getId(), snapshot.getId());
                if (snapshotDataStoreVO != null) {
                    snapshotDataStoreVO.setParentSnapshotId(0L);
                    snapshotStoreDao.update(snapshotDataStoreVO.getId(), snapshotDataStoreVO);
                }
            }
        } catch (final Exception e) {
            s_logger.debug("Failed to clean up snapshots on primary storage", e);
        }
        return backupedSnapshot;
    } finally {
        if (snapshotVO != null) {
            snapshotDao.releaseFromLockTable(snapshot.getId());
        }
    }
}
Also used : SnapshotResult(com.cloud.engine.subsystem.api.storage.SnapshotResult) SnapshotDataStoreVO(com.cloud.storage.datastore.db.SnapshotDataStoreVO) CreateSnapshotPayload(com.cloud.storage.CreateSnapshotPayload) VolumeInfo(com.cloud.engine.subsystem.api.storage.VolumeInfo) InvalidParameterValueException(com.cloud.utils.exception.InvalidParameterValueException) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) SnapshotInfo(com.cloud.engine.subsystem.api.storage.SnapshotInfo) SnapshotVO(com.cloud.storage.SnapshotVO) InvalidParameterValueException(com.cloud.utils.exception.InvalidParameterValueException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) DataStore(com.cloud.engine.subsystem.api.storage.DataStore) NoTransitionException(com.cloud.utils.fsm.NoTransitionException) DB(com.cloud.utils.db.DB)

Aggregations

SnapshotResult (com.cloud.engine.subsystem.api.storage.SnapshotResult)13 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)12 ExecutionException (java.util.concurrent.ExecutionException)10 CopyCommandResult (com.cloud.engine.subsystem.api.storage.CopyCommandResult)9 NoTransitionException (com.cloud.utils.fsm.NoTransitionException)9 SnapshotInfo (com.cloud.engine.subsystem.api.storage.SnapshotInfo)8 CommandResult (com.cloud.storage.command.CommandResult)7 AsyncCallFuture (com.cloud.framework.async.AsyncCallFuture)5 DataStore (com.cloud.engine.subsystem.api.storage.DataStore)3 PrimaryDataStore (com.cloud.engine.subsystem.api.storage.PrimaryDataStore)3 CreateCmdResult (com.cloud.engine.subsystem.api.storage.CreateCmdResult)2 PrimaryDataStoreDriver (com.cloud.engine.subsystem.api.storage.PrimaryDataStoreDriver)2 VolumeInfo (com.cloud.engine.subsystem.api.storage.VolumeInfo)2 SnapshotVO (com.cloud.storage.SnapshotVO)2 DB (com.cloud.utils.db.DB)2 CreateSnapshotPayload (com.cloud.storage.CreateSnapshotPayload)1 CopyCmdAnswer (com.cloud.storage.command.CopyCmdAnswer)1 SnapshotDataStoreVO (com.cloud.storage.datastore.db.SnapshotDataStoreVO)1 InvalidParameterValueException (com.cloud.utils.exception.InvalidParameterValueException)1