|
40 | 40 | import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector; |
41 | 41 | import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; |
42 | 42 | import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event; |
| 43 | +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore; |
43 | 44 | import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver; |
44 | 45 | import org.apache.cloudstack.engine.subsystem.api.storage.Scope; |
45 | 46 | import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo; |
|
55 | 56 | import org.apache.cloudstack.storage.command.CommandResult; |
56 | 57 | import org.apache.cloudstack.storage.command.CopyCmdAnswer; |
57 | 58 | import org.apache.cloudstack.storage.command.DeleteCommand; |
58 | | -import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore; |
59 | 59 | import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager; |
60 | 60 | import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao; |
61 | 61 | import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO; |
@@ -165,12 +165,24 @@ public AsyncCallFuture<VolumeApiResult> createVolumeAsync(VolumeInfo volume, Dat |
165 | 165 | DataObject volumeOnStore = dataStore.create(volume); |
166 | 166 | volumeOnStore.processEvent(Event.CreateOnlyRequested); |
167 | 167 |
|
168 | | - CreateVolumeContext<VolumeApiResult> context = new CreateVolumeContext<VolumeApiResult>(null, volumeOnStore, |
169 | | - future); |
170 | | - AsyncCallbackDispatcher<VolumeServiceImpl, CreateCmdResult> caller = AsyncCallbackDispatcher.create(this); |
171 | | - caller.setCallback(caller.getTarget().createVolumeCallback(null, null)).setContext(context); |
172 | | - |
173 | | - dataStore.getDriver().createAsync(dataStore, volumeOnStore, caller); |
| 168 | + try { |
| 169 | + CreateVolumeContext<VolumeApiResult> context = new CreateVolumeContext<VolumeApiResult>(null, volumeOnStore, |
| 170 | + future); |
| 171 | + AsyncCallbackDispatcher<VolumeServiceImpl, CreateCmdResult> caller = AsyncCallbackDispatcher.create(this); |
| 172 | + caller.setCallback(caller.getTarget().createVolumeCallback(null, null)).setContext(context); |
| 173 | + |
| 174 | + dataStore.getDriver().createAsync(dataStore, volumeOnStore, caller); |
| 175 | + } catch (CloudRuntimeException ex) { |
| 176 | + // clean up already persisted volume_store_ref entry in case of createVolumeCallback is never called |
| 177 | + VolumeDataStoreVO volStoreVO = _volumeStoreDao.findByStoreVolume(dataStore.getId(), volume.getId()); |
| 178 | + if (volStoreVO != null) { |
| 179 | + VolumeInfo volObj = volFactory.getVolume(volume, dataStore); |
| 180 | + volObj.processEvent(ObjectInDataStoreStateMachine.Event.OperationFailed); |
| 181 | + } |
| 182 | + VolumeApiResult volResult = new VolumeApiResult((VolumeObject)volumeOnStore); |
| 183 | + volResult.setResult(ex.getMessage()); |
| 184 | + future.complete(volResult); |
| 185 | + } |
174 | 186 | return future; |
175 | 187 | } |
176 | 188 |
|
@@ -1022,13 +1034,25 @@ public AsyncCallFuture<VolumeApiResult> registerVolume(VolumeInfo volume, DataSt |
1022 | 1034 |
|
1023 | 1035 | volumeOnStore.processEvent(Event.CreateOnlyRequested); |
1024 | 1036 |
|
1025 | | - CreateVolumeContext<VolumeApiResult> context = new CreateVolumeContext<VolumeApiResult>(null, volumeOnStore, |
1026 | | - future); |
1027 | | - AsyncCallbackDispatcher<VolumeServiceImpl, CreateCmdResult> caller = AsyncCallbackDispatcher.create(this); |
1028 | | - caller.setCallback(caller.getTarget().registerVolumeCallback(null, null)); |
1029 | | - caller.setContext(context); |
1030 | | - |
1031 | | - store.getDriver().createAsync(store, volumeOnStore, caller); |
| 1037 | + try { |
| 1038 | + CreateVolumeContext<VolumeApiResult> context = new CreateVolumeContext<VolumeApiResult>(null, volumeOnStore, |
| 1039 | + future); |
| 1040 | + AsyncCallbackDispatcher<VolumeServiceImpl, CreateCmdResult> caller = AsyncCallbackDispatcher.create(this); |
| 1041 | + caller.setCallback(caller.getTarget().registerVolumeCallback(null, null)); |
| 1042 | + caller.setContext(context); |
| 1043 | + |
| 1044 | + store.getDriver().createAsync(store, volumeOnStore, caller); |
| 1045 | + } catch (CloudRuntimeException ex) { |
| 1046 | + // clean up already persisted volume_store_ref entry in case of createVolumeCallback is never called |
| 1047 | + VolumeDataStoreVO volStoreVO = _volumeStoreDao.findByStoreVolume(store.getId(), volume.getId()); |
| 1048 | + if (volStoreVO != null) { |
| 1049 | + VolumeInfo volObj = volFactory.getVolume(volume, store); |
| 1050 | + volObj.processEvent(ObjectInDataStoreStateMachine.Event.OperationFailed); |
| 1051 | + } |
| 1052 | + VolumeApiResult res = new VolumeApiResult((VolumeObject)volumeOnStore); |
| 1053 | + res.setResult(ex.getMessage()); |
| 1054 | + future.complete(res); |
| 1055 | + } |
1032 | 1056 | return future; |
1033 | 1057 | } |
1034 | 1058 |
|
|
0 commit comments