CLOUDSTACK-7835: Deleted volumes with null UUID and no removed timestamp in 
database still appear.
Also removed CREATING -> DESTROY via DESTROYREQUESTED, which was causing the 
volume to get stuck in expunging
state.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/a53d39c1
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/a53d39c1
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/a53d39c1

Branch: refs/heads/4.5
Commit: a53d39c1b687df22768613d556637c34354cb96b
Parents: 9168d82
Author: Sanjay Tripathi <sanjay.tripa...@citrix.com>
Authored: Tue Nov 4 13:27:17 2014 +0530
Committer: Sanjay Tripathi <sanjay.tripa...@citrix.com>
Committed: Tue Nov 4 17:57:31 2014 +0530

----------------------------------------------------------------------
 api/src/com/cloud/storage/Volume.java            |  1 -
 .../storage/volume/VolumeServiceImpl.java        | 19 ++++++++++++++-----
 2 files changed, 14 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a53d39c1/api/src/com/cloud/storage/Volume.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/storage/Volume.java 
b/api/src/com/cloud/storage/Volume.java
index b67a395..91ad955 100755
--- a/api/src/com/cloud/storage/Volume.java
+++ b/api/src/com/cloud/storage/Volume.java
@@ -69,7 +69,6 @@ public interface Volume extends ControlledEntity, Identity, 
InternalIdentity, Ba
             s_fsm.addTransition(Creating, Event.OperationRetry, Creating);
             s_fsm.addTransition(Creating, Event.OperationFailed, Allocated);
             s_fsm.addTransition(Creating, Event.OperationSucceeded, Ready);
-            s_fsm.addTransition(Creating, Event.DestroyRequested, Destroy);
             s_fsm.addTransition(Creating, Event.CreateRequested, Creating);
             s_fsm.addTransition(Ready, Event.ResizeRequested, Resizing);
             s_fsm.addTransition(Resizing, Event.OperationSucceeded, Ready);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a53d39c1/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
 
b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
index d97ad60..1297da9 100644
--- 
a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
+++ 
b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
@@ -1021,11 +1021,20 @@ public class VolumeServiceImpl implements VolumeService 
{
             srcVolume.processEvent(Event.OperationSuccessed);
             destVolume.processEvent(Event.OperationSuccessed, 
result.getAnswer());
             _volumeDao.updateUuid(srcVolume.getId(), destVolume.getId());
-            destroyVolume(srcVolume.getId());
-            srcVolume = volFactory.getVolume(srcVolume.getId());
-            AsyncCallFuture<VolumeApiResult> destroyFuture = 
expungeVolumeAsync(srcVolume);
-            destroyFuture.get();
-            future.complete(res);
+            try {
+                destroyVolume(srcVolume.getId());
+                srcVolume = volFactory.getVolume(srcVolume.getId());
+                AsyncCallFuture<VolumeApiResult> destroyFuture = 
expungeVolumeAsync(srcVolume);
+                // If volume destroy fails, this could be because of vdi is 
still in use state, so wait and retry.
+                if (destroyFuture.get().isFailed()) {
+                    Thread.sleep(5 * 1000);
+                    destroyFuture = expungeVolumeAsync(srcVolume);
+                    destroyFuture.get();
+                }
+                future.complete(res);
+            } catch (Exception e) {
+                s_logger.debug("failed to clean up volume on storage", e);
+            }
             return null;
         } catch (Exception e) {
             s_logger.debug("Failed to process copy volume callback", e);

Reply via email to