Updated Branches:
  refs/heads/object_store 2f6d94462 -> cb0659ab3

Clean up entries in template_store_ref, volume_store_ref and
snapshot_store_ref in case of operation failure.

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

Branch: refs/heads/object_store
Commit: 8f549db518ed94b25dc17d42f3a25907aad0d66e
Parents: 2f6d944
Author: Min Chen <[email protected]>
Authored: Tue May 21 12:00:04 2013 -0700
Committer: Min Chen <[email protected]>
Committed: Tue May 21 12:00:04 2013 -0700

----------------------------------------------------------------------
 .../subsystem/api/storage/StorageCacheManager.java |    2 +-
 .../storage/datastore/db/SnapshotDataStoreVO.java  |    2 -
 .../storage/motion/AncientDataMotionStrategy.java  |   36 ++-
 .../storage/image/store/TemplateObject.java        |   18 +-
 .../storage/snapshot/SnapshotObject.java           |  258 ++++++++-------
 .../cloudstack/storage/volume/VolumeObject.java    |   80 +++--
 6 files changed, 216 insertions(+), 180 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8f549db5/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageCacheManager.java
----------------------------------------------------------------------
diff --git 
a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageCacheManager.java
 
b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageCacheManager.java
index 0aa30d3..917a537 100644
--- 
a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageCacheManager.java
+++ 
b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageCacheManager.java
@@ -28,5 +28,5 @@ public interface StorageCacheManager {
      * @return
      */
     DataObject getCacheObject(DataObject data, Scope scope);
-    DataObject deleteCacheObject(DataObject data);
+    boolean deleteCacheObject(DataObject data);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8f549db5/engine/api/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
----------------------------------------------------------------------
diff --git 
a/engine/api/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
 
b/engine/api/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
index 0085086..edb23d0 100644
--- 
a/engine/api/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
+++ 
b/engine/api/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
@@ -81,8 +81,6 @@ public class SnapshotDataStoreVO implements 
StateObject<ObjectInDataStoreStateMa
        @Column (name="install_path")
     private String installPath;
 
-    @Column(name = GenericDao.REMOVED_COLUMN)
-    Date removed;
 
     @Column(name="update_count", updatable = true, nullable=false)
     protected long updatedCount;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8f549db5/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
----------------------------------------------------------------------
diff --git 
a/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
 
b/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
index 73be162..cea4069 100644
--- 
a/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
+++ 
b/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
@@ -233,7 +233,7 @@ public class AncientDataMotionStrategy implements 
DataMotionStrategy {
             CopyCommand cmd = new CopyCommand(srcData.getTO(), volObj.getTO(), 
_createVolumeFromSnapshotWait);
             EndPoint ep = selector.select(snapObj, volObj);
             Answer answer = ep.sendMessage(cmd);
-           
+
            return answer;
         } catch (Exception e) {
             s_logger.error(basicErrMsg, e);
@@ -299,7 +299,7 @@ public class AncientDataMotionStrategy implements 
DataMotionStrategy {
             } else if (srcData.getType() == DataObjectType.SNAPSHOT &&
                        destData.getType() == DataObjectType.SNAPSHOT) {
                answer = copySnapshot(srcData, destData);
-            } 
+            }
 
             if (answer != null && !answer.getResult()) {
                 errMsg = answer.getDetails();
@@ -368,21 +368,27 @@ public class AncientDataMotionStrategy implements 
DataMotionStrategy {
         int _backupsnapshotwait = NumbersUtil.parseInt(value, 
Integer.parseInt(Config.BackupSnapshotWait.getDefaultValue()));
 
         DataObject cacheData = null;
+        Answer answer = null;
         try {
-        if (needCacheStorage(srcData, destData)) {
-            cacheData = cacheMgr.getCacheObject(srcData, 
destData.getDataStore().getScope());
-
-            CopyCommand cmd = new CopyCommand(srcData.getTO(), 
destData.getTO(), _backupsnapshotwait);
-            cmd.setCacheTO(cacheData.getTO());
-            EndPoint ep = selector.select(srcData, destData);
-            Answer answer = ep.sendMessage(cmd);
-            return answer;
-        } else {
-            CopyCommand cmd = new CopyCommand(srcData.getTO(), 
destData.getTO(), _backupsnapshotwait);
-            EndPoint ep = selector.select(srcData, destData);
-            Answer answer = ep.sendMessage(cmd);
+            if (needCacheStorage(srcData, destData)) {
+                cacheData = cacheMgr.getCacheObject(srcData, 
destData.getDataStore().getScope());
+
+                CopyCommand cmd = new CopyCommand(srcData.getTO(), 
destData.getTO(), _backupsnapshotwait);
+                cmd.setCacheTO(cacheData.getTO());
+                EndPoint ep = selector.select(srcData, destData);
+                answer = ep.sendMessage(cmd);
+            } else {
+                CopyCommand cmd = new CopyCommand(srcData.getTO(), 
destData.getTO(), _backupsnapshotwait);
+                EndPoint ep = selector.select(srcData, destData);
+                answer = ep.sendMessage(cmd);
+            }
+            // clean up cache entry in case of failure
+            if (answer == null || !answer.getResult()) {
+                if (cacheData != null) {
+                    cacheMgr.deleteCacheObject(cacheData);
+                }
+            }
             return answer;
-        }
         } catch (Exception e) {
             s_logger.debug("copy snasphot failed: " + e.toString());
             if (cacheData != null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8f549db5/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java
----------------------------------------------------------------------
diff --git 
a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java
 
b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java
index a94716e..4b995b0 100644
--- 
a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java
+++ 
b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java
@@ -63,7 +63,7 @@ public class TemplateObject implements TemplateInfo {
     @Inject
     VMTemplateDao imageDao;
     @Inject
-    ObjectInDataStoreManager ojbectInStoreMgr;
+    ObjectInDataStoreManager objectInStoreMgr;
     @Inject VMTemplatePoolDao templatePoolDao;
     @Inject TemplateDataStoreDao templateStoreDao;
 
@@ -191,10 +191,15 @@ public class TemplateObject implements TemplateInfo {
                 }
             }
 
-            ojbectInStoreMgr.update(this, event);
+            objectInStoreMgr.update(this, event);
         } catch (NoTransitionException e) {
             s_logger.debug("failed to update state", e);
             throw new CloudRuntimeException("Failed to update state" + 
e.toString());
+        } finally{
+            // in case of OperationFailed, expunge the entry
+            if ( event == ObjectInDataStoreStateMachine.Event.OperationFailed){
+                objectInStoreMgr.delete(this);
+            }
         }
     }
 
@@ -247,10 +252,15 @@ public class TemplateObject implements TemplateInfo {
                            this.stateTransit(templEvent);
                        }
                }
-            ojbectInStoreMgr.update(this, event);
+            objectInStoreMgr.update(this, event);
         } catch (NoTransitionException e) {
             s_logger.debug("failed to update state", e);
             throw new CloudRuntimeException("Failed to update state" + 
e.toString());
+        } finally{
+            // in case of OperationFailed, expunge the entry
+            if ( event == ObjectInDataStoreStateMachine.Event.OperationFailed){
+                objectInStoreMgr.delete(this);
+            }
         }
     }
 
@@ -266,7 +276,7 @@ public class TemplateObject implements TemplateInfo {
 
        @Override
        public String getInstallPath() {
-                DataObjectInStore obj = ojbectInStoreMgr.findObject(this, 
this.dataStore);
+                DataObjectInStore obj = objectInStoreMgr.findObject(this, 
this.dataStore);
          return obj.getInstallPath();
        }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8f549db5/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
----------------------------------------------------------------------
diff --git 
a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
 
b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
index 3cfe480..8b3c1f6 100644
--- 
a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
+++ 
b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
@@ -52,34 +52,37 @@ import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.fsm.NoTransitionException;
 
 public class SnapshotObject implements SnapshotInfo {
-       private static final Logger s_logger = 
Logger.getLogger(SnapshotObject.class);
+    private static final Logger s_logger = 
Logger.getLogger(SnapshotObject.class);
     private SnapshotVO snapshot;
     private DataStore store;
     @Inject
     protected SnapshotDao snapshotDao;
     @Inject
     protected VolumeDao volumeDao;
-    @Inject protected VolumeDataFactory volFactory;
-    @Inject protected SnapshotStateMachineManager stateMachineMgr;
+    @Inject
+    protected VolumeDataFactory volFactory;
+    @Inject
+    protected SnapshotStateMachineManager stateMachineMgr;
     @Inject
     SnapshotDataFactory snapshotFactory;
     @Inject
-    ObjectInDataStoreManager ojbectInStoreMgr;
+    ObjectInDataStoreManager objectInStoreMgr;
     @Inject
     SnapshotDataStoreDao snapshotStoreDao;
+
     public SnapshotObject() {
 
     }
 
     protected void configure(SnapshotVO snapshot, DataStore store) {
-       this.snapshot = snapshot;
-       this.store = store;
+        this.snapshot = snapshot;
+        this.store = store;
     }
 
     public static SnapshotObject getSnapshotObject(SnapshotVO snapshot, 
DataStore store) {
-       SnapshotObject snapObj = ComponentContext.inject(SnapshotObject.class);
-       snapObj.configure(snapshot, store);
-       return snapObj;
+        SnapshotObject snapObj = ComponentContext.inject(SnapshotObject.class);
+        snapObj.configure(snapshot, store);
+        return snapObj;
     }
 
     public DataStore getStore() {
@@ -88,17 +91,17 @@ public class SnapshotObject implements SnapshotInfo {
 
     @Override
     public SnapshotInfo getParent() {
-       SnapshotDataStoreVO snapStoreVO = 
this.snapshotStoreDao.findByStoreSnapshot(this.store.getRole(), 
this.store.getId(), this.snapshot.getId());
-       if (snapStoreVO == null) {
-           return null;
-       }
+        SnapshotDataStoreVO snapStoreVO = 
this.snapshotStoreDao.findByStoreSnapshot(this.store.getRole(), 
this.store.getId(), this.snapshot.getId());
+        if (snapStoreVO == null) {
+            return null;
+        }
 
-       long parentId = snapStoreVO.getParentSnapshotId();
-       if (parentId == 0) {
-           return null;
-       }
+        long parentId = snapStoreVO.getParentSnapshotId();
+        if (parentId == 0) {
+            return null;
+        }
 
-       return this.snapshotFactory.getSnapshot(parentId, store);
+        return this.snapshotFactory.getSnapshot(parentId, store);
     }
 
     @Override
@@ -121,7 +124,7 @@ public class SnapshotObject implements SnapshotInfo {
 
     @Override
     public long getId() {
-       return this.snapshot.getId();
+        return this.snapshot.getId();
     }
 
     @Override
@@ -136,100 +139,100 @@ public class SnapshotObject implements SnapshotInfo {
 
     @Override
     public Long getSize() {
-       return this.snapshot.getSize();
+        return this.snapshot.getSize();
     }
 
     @Override
     public DataObjectType getType() {
-       return DataObjectType.SNAPSHOT;
+        return DataObjectType.SNAPSHOT;
     }
 
-
     @Override
     public String getUuid() {
         return this.snapshot.getUuid();
     }
 
-       @Override
-       public void processEvent(
-                       ObjectInDataStoreStateMachine.Event event) {
-               try {
-                       ojbectInStoreMgr.update(this, event);
-               } catch (Exception e) {
-                       s_logger.debug("Failed to update state:" + 
e.toString());
-                       throw new CloudRuntimeException("Failed to update 
state: " + e.toString());
-               }
-       }
-
-       @Override
-       public long getAccountId() {
-               return this.snapshot.getAccountId();
-       }
-
-       @Override
-       public long getVolumeId() {
-               return this.snapshot.getVolumeId();
-       }
-
-       @Override
-       public String getPath() {
-               return this.ojbectInStoreMgr.findObject(this, 
getDataStore()).getInstallPath();
-       }
-
-       @Override
-       public String getName() {
-               return this.snapshot.getName();
-       }
-
-       @Override
-       public Date getCreated() {
-               return this.snapshot.getCreated();
-       }
-
-       @Override
-       public Type getRecurringType() {
-               return this.snapshot.getRecurringType();
-       }
-
-       @Override
-       public State getState() {
-               return this.snapshot.getState();
-       }
-
-       @Override
-       public HypervisorType getHypervisorType() {
-               return this.snapshot.getHypervisorType();
-       }
-
-       @Override
-       public boolean isRecursive() {
-               return this.snapshot.isRecursive();
-       }
-
-       @Override
-       public short getsnapshotType() {
-               return this.snapshot.getsnapshotType();
-       }
-
-       @Override
-       public long getDomainId() {
-               return this.snapshot.getDomainId();
-       }
-
-
-       @Override
-       public Long getDataCenterId() {
-               return this.snapshot.getDataCenterId();
-       }
-
-       public void processEvent(Snapshot.Event event)
-                       throws NoTransitionException {
-               stateMachineMgr.processEvent(this.snapshot, event);
-       }
-
-       public SnapshotVO getSnapshotVO(){
-           return this.snapshot;
-       }
+    @Override
+    public void processEvent(ObjectInDataStoreStateMachine.Event event) {
+        try {
+            objectInStoreMgr.update(this, event);
+        } catch (Exception e) {
+            s_logger.debug("Failed to update state:" + e.toString());
+            throw new CloudRuntimeException("Failed to update state: " + 
e.toString());
+        } finally {
+            if (event == ObjectInDataStoreStateMachine.Event.OperationFailed) {
+                objectInStoreMgr.delete(this);
+            }
+        }
+    }
+
+    @Override
+    public long getAccountId() {
+        return this.snapshot.getAccountId();
+    }
+
+    @Override
+    public long getVolumeId() {
+        return this.snapshot.getVolumeId();
+    }
+
+    @Override
+    public String getPath() {
+        return this.objectInStoreMgr.findObject(this, 
getDataStore()).getInstallPath();
+    }
+
+    @Override
+    public String getName() {
+        return this.snapshot.getName();
+    }
+
+    @Override
+    public Date getCreated() {
+        return this.snapshot.getCreated();
+    }
+
+    @Override
+    public Type getRecurringType() {
+        return this.snapshot.getRecurringType();
+    }
+
+    @Override
+    public State getState() {
+        return this.snapshot.getState();
+    }
+
+    @Override
+    public HypervisorType getHypervisorType() {
+        return this.snapshot.getHypervisorType();
+    }
+
+    @Override
+    public boolean isRecursive() {
+        return this.snapshot.isRecursive();
+    }
+
+    @Override
+    public short getsnapshotType() {
+        return this.snapshot.getsnapshotType();
+    }
+
+    @Override
+    public long getDomainId() {
+        return this.snapshot.getDomainId();
+    }
+
+    @Override
+    public Long getDataCenterId() {
+        return this.snapshot.getDataCenterId();
+    }
+
+    public void processEvent(Snapshot.Event event) throws 
NoTransitionException {
+        stateMachineMgr.processEvent(this.snapshot, event);
+    }
+
+    public SnapshotVO getSnapshotVO() {
+        return this.snapshot;
+    }
 
     @Override
     public DataTO getTO() {
@@ -242,34 +245,41 @@ public class SnapshotObject implements SnapshotInfo {
 
     @Override
     public void processEvent(ObjectInDataStoreStateMachine.Event event, Answer 
answer) {
-       SnapshotDataStoreVO snapshotStore = 
this.snapshotStoreDao.findByStoreSnapshot(this.getDataStore().getRole(),
-                  this.getDataStore().getId(), this.getId());
-       if (answer instanceof CreateObjectAnswer) {
-               SnapshotObjectTO snapshotTO = 
(SnapshotObjectTO)((CreateObjectAnswer) answer).getData();
-               snapshotStore.setInstallPath(snapshotTO.getPath());
-               this.snapshotStoreDao.update(snapshotStore.getId(), 
snapshotStore);
-       } else if (answer instanceof CopyCmdAnswer) {
-           SnapshotObjectTO snapshotTO = (SnapshotObjectTO)((CopyCmdAnswer) 
answer).getNewData();
-           snapshotStore.setInstallPath(snapshotTO.getPath());
-           if (snapshotTO.getParentSnapshotPath() == null) {
-               snapshotStore.setParentSnapshotId(0L);
-           }
-           this.snapshotStoreDao.update(snapshotStore.getId(), snapshotStore);
-       } else {
-               throw new CloudRuntimeException("Unknown answer: " + 
answer.getClass());
-       }
-       this.processEvent(event);
+        try {
+            SnapshotDataStoreVO snapshotStore = 
this.snapshotStoreDao.findByStoreSnapshot(this.getDataStore().getRole(), 
this.getDataStore().getId(),
+                    this.getId());
+            if (answer instanceof CreateObjectAnswer) {
+                SnapshotObjectTO snapshotTO = (SnapshotObjectTO) 
((CreateObjectAnswer) answer).getData();
+                snapshotStore.setInstallPath(snapshotTO.getPath());
+                this.snapshotStoreDao.update(snapshotStore.getId(), 
snapshotStore);
+            } else if (answer instanceof CopyCmdAnswer) {
+                SnapshotObjectTO snapshotTO = (SnapshotObjectTO) 
((CopyCmdAnswer) answer).getNewData();
+                snapshotStore.setInstallPath(snapshotTO.getPath());
+                if (snapshotTO.getParentSnapshotPath() == null) {
+                    snapshotStore.setParentSnapshotId(0L);
+                }
+                this.snapshotStoreDao.update(snapshotStore.getId(), 
snapshotStore);
+            } else {
+                throw new CloudRuntimeException("Unknown answer: " + 
answer.getClass());
+            }
+        } catch (RuntimeException ex) {
+            if (event == ObjectInDataStoreStateMachine.Event.OperationFailed) {
+                objectInStoreMgr.delete(this);
+            }
+            throw ex;
+        }
+        this.processEvent(event);
     }
 
     @Override
     public ObjectInDataStoreStateMachine.State getStatus() {
-       return this.ojbectInStoreMgr.findObject(this, 
store).getObjectInStoreState();
+        return this.objectInStoreMgr.findObject(this, 
store).getObjectInStoreState();
     }
 
-       @Override
-       public void addPayload(Object data) {
-               // TODO Auto-generated method stub
+    @Override
+    public void addPayload(Object data) {
+        // TODO Auto-generated method stub
 
-       }
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8f549db5/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
----------------------------------------------------------------------
diff --git 
a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
 
b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
index e1f0180..a2a9045 100644
--- 
a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
+++ 
b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
@@ -59,7 +59,7 @@ public class VolumeObject implements VolumeInfo {
     @Inject
     VolumeDataStoreDao volumeStoreDao;
     @Inject
-    ObjectInDataStoreManager ojbectInStoreMgr;
+    ObjectInDataStoreManager objectInStoreMgr;
     @Inject
     VMInstanceDao vmInstanceDao;
     private Object payload;
@@ -159,7 +159,7 @@ public class VolumeObject implements VolumeInfo {
         if (this.dataStore == null) {
             throw new CloudRuntimeException("datastore must be set before 
using this object");
         }
-        DataObjectInStore obj = 
ojbectInStoreMgr.findObject(this.volumeVO.getId(), DataObjectType.VOLUME, 
this.dataStore.getId(), this.dataStore.getRole());
+        DataObjectInStore obj = 
objectInStoreMgr.findObject(this.volumeVO.getId(), DataObjectType.VOLUME, 
this.dataStore.getId(), this.dataStore.getRole());
         if (obj.getState() != ObjectInDataStoreStateMachine.State.Ready) {
             return this.dataStore.getUri() +
                     "&" + EncodingType.OBJTYPE + "=" + DataObjectType.VOLUME +
@@ -187,11 +187,11 @@ public class VolumeObject implements VolumeInfo {
         try {
             Volume.Event volEvent = null;
             if ( this.dataStore.getRole() == DataStoreRole.ImageCache){
-                ojbectInStoreMgr.update(this, event);
+                objectInStoreMgr.update(this, event);
                 return;
             }
             if (this.dataStore.getRole() == DataStoreRole.Image) {
-                ojbectInStoreMgr.update(this, event);
+                objectInStoreMgr.update(this, event);
                 if (event == 
ObjectInDataStoreStateMachine.Event.CreateRequested) {
                     volEvent = Volume.Event.UploadRequested;
                 } else if (event == 
ObjectInDataStoreStateMachine.Event.OperationSuccessed) {
@@ -225,6 +225,11 @@ public class VolumeObject implements VolumeInfo {
         } catch (Exception e) {
             s_logger.debug("Failed to update state", e);
             throw new CloudRuntimeException("Failed to update state:" + 
e.toString());
+        } finally{
+            // in case of OperationFailed, expunge the entry
+            if ( event == ObjectInDataStoreStateMachine.Event.OperationFailed){
+                objectInStoreMgr.delete(this);
+            }
         }
 
     }
@@ -249,7 +254,7 @@ public class VolumeObject implements VolumeInfo {
         if (this.dataStore.getRole() == DataStoreRole.Primary) {
             return this.volumeVO.getPath();
         } else {
-            DataObjectInStore objInStore = 
this.ojbectInStoreMgr.findObject(this, dataStore);
+            DataObjectInStore objInStore = 
this.objectInStoreMgr.findObject(this, dataStore);
             return objInStore.getInstallPath();
         }
     }
@@ -379,34 +384,41 @@ public class VolumeObject implements VolumeInfo {
 
     @Override
     public void processEvent(ObjectInDataStoreStateMachine.Event event, Answer 
answer) {
-       if (this.dataStore.getRole() == DataStoreRole.Primary) {
-           if (answer instanceof CopyCmdAnswer) {
-               CopyCmdAnswer cpyAnswer = (CopyCmdAnswer)answer;
-               VolumeVO vol = this.volumeDao.findById(this.getId());
-               VolumeObjectTO newVol = (VolumeObjectTO)cpyAnswer.getNewData();
-               vol.setPath(newVol.getPath());
-               vol.setSize(newVol.getSize());
-               vol.setPoolId(this.getDataStore().getId());
-               volumeDao.update(vol.getId(), vol);
-           } else if (answer instanceof CreateObjectAnswer) {
-               CreateObjectAnswer createAnswer =(CreateObjectAnswer)answer;
-               VolumeObjectTO newVol = (VolumeObjectTO)createAnswer.getData();
-               VolumeVO vol = this.volumeDao.findById(this.getId());
-               vol.setPath(newVol.getPath());
-               vol.setSize(newVol.getSize());
-               vol.setPoolId(this.getDataStore().getId());
-               volumeDao.update(vol.getId(), vol);
-           }
-       } else if (this.dataStore.getRole() == DataStoreRole.Image) {
-           if (answer instanceof DownloadAnswer) {
-               DownloadAnswer dwdAnswer = (DownloadAnswer)answer;
-               VolumeDataStoreVO volStore = 
this.volumeStoreDao.findByStoreVolume(this.dataStore.getId(), this.getId());
-               volStore.setInstallPath(dwdAnswer.getInstallPath());
-               volStore.setChecksum(dwdAnswer.getCheckSum());
-               this.volumeStoreDao.update(volStore.getId(), volStore);
-           }
-       }
-
-       this.processEvent(event);
+        try {
+            if (this.dataStore.getRole() == DataStoreRole.Primary) {
+                if (answer instanceof CopyCmdAnswer) {
+                    CopyCmdAnswer cpyAnswer = (CopyCmdAnswer) answer;
+                    VolumeVO vol = this.volumeDao.findById(this.getId());
+                    VolumeObjectTO newVol = (VolumeObjectTO) 
cpyAnswer.getNewData();
+                    vol.setPath(newVol.getPath());
+                    vol.setSize(newVol.getSize());
+                    vol.setPoolId(this.getDataStore().getId());
+                    volumeDao.update(vol.getId(), vol);
+                } else if (answer instanceof CreateObjectAnswer) {
+                    CreateObjectAnswer createAnswer = (CreateObjectAnswer) 
answer;
+                    VolumeObjectTO newVol = (VolumeObjectTO) 
createAnswer.getData();
+                    VolumeVO vol = this.volumeDao.findById(this.getId());
+                    vol.setPath(newVol.getPath());
+                    vol.setSize(newVol.getSize());
+                    vol.setPoolId(this.getDataStore().getId());
+                    volumeDao.update(vol.getId(), vol);
+                }
+            } else if (this.dataStore.getRole() == DataStoreRole.Image) {
+                if (answer instanceof DownloadAnswer) {
+                    DownloadAnswer dwdAnswer = (DownloadAnswer) answer;
+                    VolumeDataStoreVO volStore = 
this.volumeStoreDao.findByStoreVolume(this.dataStore.getId(), this.getId());
+                    volStore.setInstallPath(dwdAnswer.getInstallPath());
+                    volStore.setChecksum(dwdAnswer.getCheckSum());
+                    this.volumeStoreDao.update(volStore.getId(), volStore);
+                }
+            }
+        } catch (RuntimeException ex) {
+            if (event == ObjectInDataStoreStateMachine.Event.OperationFailed) {
+                objectInStoreMgr.delete(this);
+            }
+            throw ex;
+        }
+        this.processEvent(event);
+
     }
 }

Reply via email to