Skip to content

Commit da5c461

Browse files
sanjaytripathidevdeep
authored andcommitted
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.
1 parent e218a6d commit da5c461

1 file changed

Lines changed: 40 additions & 39 deletions

File tree

engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java

Lines changed: 40 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -428,51 +428,52 @@ public boolean destroyVolume(long volumeId)
428428
public AsyncCallFuture<VolumeApiResult> createVolumeFromSnapshot(
429429
VolumeInfo volume, DataStore store, SnapshotInfo snapshot) {
430430
AsyncCallFuture<VolumeApiResult> future = new AsyncCallFuture<VolumeApiResult>();
431-
431+
432432
try {
433-
DataObject volumeOnStore = store.create(volume);
434-
volume.processEvent(Event.CreateOnlyRequested);
435-
CreateVolumeFromBaseImageContext<VolumeApiResult> context = new CreateVolumeFromBaseImageContext<VolumeApiResult>(null,
436-
(VolumeObject)volume, store, volumeOnStore, future);
437-
AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
438-
caller.setCallback(caller.getTarget().createVolumeFromSnapshotCallback(null, null))
439-
.setContext(context);
440-
this.motionSrv.copyAsync(snapshot, volumeOnStore, caller);
433+
DataObject volumeOnStore = store.create(volume);
434+
volume = this.volFactory.getVolume(volume.getId(), store);
435+
volume.processEvent(Event.CreateOnlyRequested);
436+
CreateVolumeFromBaseImageContext<VolumeApiResult> context = new CreateVolumeFromBaseImageContext<VolumeApiResult>(null,
437+
(VolumeObject)volume, store, volumeOnStore, future);
438+
AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
439+
caller.setCallback(caller.getTarget().createVolumeFromSnapshotCallback(null, null))
440+
.setContext(context);
441+
this.motionSrv.copyAsync(snapshot, volumeOnStore, caller);
441442
} catch (Exception e) {
442-
s_logger.debug("create volume from snapshot failed", e);
443-
VolumeApiResult result = new VolumeApiResult(volume);
444-
result.setResult(e.toString());
445-
future.complete(result);
443+
s_logger.debug("create volume from snapshot failed", e);
444+
VolumeApiResult result = new VolumeApiResult(volume);
445+
result.setResult(e.toString());
446+
future.complete(result);
446447
}
447-
448+
448449
return future;
449450
}
450-
451-
protected Void createVolumeFromSnapshotCallback(AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> callback,
452-
CreateVolumeFromBaseImageContext<VolumeApiResult> context) {
453-
CopyCommandResult result = callback.getResult();
454-
VolumeInfo volume = context.vo;
455-
VolumeApiResult apiResult = new VolumeApiResult(volume);
456-
Event event = null;
457-
if (result.isFailed()) {
458-
apiResult.setResult(result.getResult());
459-
event = Event.OperationFailed;
460-
} else {
461-
event = Event.OperationSuccessed;
462-
}
463-
464-
try {
465-
volume.processEvent(event);
466-
} catch (Exception e) {
467-
s_logger.debug("create volume from snapshot failed", e);
468-
apiResult.setResult(e.toString());
469-
}
470-
471-
AsyncCallFuture<VolumeApiResult> future = context.future;
472-
future.complete(apiResult);
473-
return null;
451+
452+
protected Void createVolumeFromSnapshotCallback(AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> callback,
453+
CreateVolumeFromBaseImageContext<VolumeApiResult> context) {
454+
CopyCommandResult result = callback.getResult();
455+
VolumeInfo volume = context.vo;
456+
VolumeApiResult apiResult = new VolumeApiResult(volume);
457+
Event event = null;
458+
if (result.isFailed()) {
459+
apiResult.setResult(result.getResult());
460+
event = Event.OperationFailed;
461+
} else {
462+
event = Event.OperationSuccessed;
463+
}
464+
465+
try {
466+
volume.processEvent(event);
467+
} catch (Exception e) {
468+
s_logger.debug("create volume from snapshot failed", e);
469+
apiResult.setResult(e.toString());
470+
}
471+
472+
AsyncCallFuture<VolumeApiResult> future = context.future;
473+
future.complete(apiResult);
474+
return null;
474475
}
475-
476+
476477
protected VolumeVO duplicateVolumeOnAnotherStorage(Volume volume, StoragePool pool) {
477478
Long lastPoolId = volume.getPoolId();
478479
VolumeVO newVol = new VolumeVO(volume);

0 commit comments

Comments
 (0)