CLOUDSTACK-2286: Volume created from snapshot state is in allocated state instead of Ready state which is letting Primary storage not to increment the resources.

This commit is contained in:
Sanjay Tripathi 2013-06-07 17:08:31 +05:30 committed by Devdeep Singh
parent e218a6dcfd
commit da5c4619c3

View File

@ -428,51 +428,52 @@ public class VolumeServiceImpl implements VolumeService {
public AsyncCallFuture<VolumeApiResult> createVolumeFromSnapshot( public AsyncCallFuture<VolumeApiResult> createVolumeFromSnapshot(
VolumeInfo volume, DataStore store, SnapshotInfo snapshot) { VolumeInfo volume, DataStore store, SnapshotInfo snapshot) {
AsyncCallFuture<VolumeApiResult> future = new AsyncCallFuture<VolumeApiResult>(); AsyncCallFuture<VolumeApiResult> future = new AsyncCallFuture<VolumeApiResult>();
try { try {
DataObject volumeOnStore = store.create(volume); DataObject volumeOnStore = store.create(volume);
volume.processEvent(Event.CreateOnlyRequested); volume = this.volFactory.getVolume(volume.getId(), store);
CreateVolumeFromBaseImageContext<VolumeApiResult> context = new CreateVolumeFromBaseImageContext<VolumeApiResult>(null, volume.processEvent(Event.CreateOnlyRequested);
(VolumeObject)volume, store, volumeOnStore, future); CreateVolumeFromBaseImageContext<VolumeApiResult> context = new CreateVolumeFromBaseImageContext<VolumeApiResult>(null,
AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this); (VolumeObject)volume, store, volumeOnStore, future);
caller.setCallback(caller.getTarget().createVolumeFromSnapshotCallback(null, null)) AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
.setContext(context); caller.setCallback(caller.getTarget().createVolumeFromSnapshotCallback(null, null))
this.motionSrv.copyAsync(snapshot, volumeOnStore, caller); .setContext(context);
this.motionSrv.copyAsync(snapshot, volumeOnStore, caller);
} catch (Exception e) { } catch (Exception e) {
s_logger.debug("create volume from snapshot failed", e); s_logger.debug("create volume from snapshot failed", e);
VolumeApiResult result = new VolumeApiResult(volume); VolumeApiResult result = new VolumeApiResult(volume);
result.setResult(e.toString()); result.setResult(e.toString());
future.complete(result); future.complete(result);
} }
return future; return future;
} }
protected Void createVolumeFromSnapshotCallback(AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> callback, protected Void createVolumeFromSnapshotCallback(AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> callback,
CreateVolumeFromBaseImageContext<VolumeApiResult> context) { CreateVolumeFromBaseImageContext<VolumeApiResult> context) {
CopyCommandResult result = callback.getResult(); CopyCommandResult result = callback.getResult();
VolumeInfo volume = context.vo; VolumeInfo volume = context.vo;
VolumeApiResult apiResult = new VolumeApiResult(volume); VolumeApiResult apiResult = new VolumeApiResult(volume);
Event event = null; Event event = null;
if (result.isFailed()) { if (result.isFailed()) {
apiResult.setResult(result.getResult()); apiResult.setResult(result.getResult());
event = Event.OperationFailed; event = Event.OperationFailed;
} else { } else {
event = Event.OperationSuccessed; event = Event.OperationSuccessed;
} }
try { try {
volume.processEvent(event); volume.processEvent(event);
} catch (Exception e) { } catch (Exception e) {
s_logger.debug("create volume from snapshot failed", e); s_logger.debug("create volume from snapshot failed", e);
apiResult.setResult(e.toString()); apiResult.setResult(e.toString());
} }
AsyncCallFuture<VolumeApiResult> future = context.future; AsyncCallFuture<VolumeApiResult> future = context.future;
future.complete(apiResult); future.complete(apiResult);
return null; return null;
} }
protected VolumeVO duplicateVolumeOnAnotherStorage(Volume volume, StoragePool pool) { protected VolumeVO duplicateVolumeOnAnotherStorage(Volume volume, StoragePool pool) {
Long lastPoolId = volume.getPoolId(); Long lastPoolId = volume.getPoolId();
VolumeVO newVol = new VolumeVO(volume); VolumeVO newVol = new VolumeVO(volume);