CLOUDSTACK-4003: We should not delete a READY data object from object

store ref table in case of any operation failure related to this data
object.
This commit is contained in:
Min Chen 2013-08-06 11:41:18 -07:00
parent 5908a3931c
commit a8990cffd4
5 changed files with 59 additions and 8 deletions

View File

@ -167,7 +167,7 @@ public class TemplateObject implements TemplateInfo {
} finally {
// in case of OperationFailed, expunge the entry
if (event == ObjectInDataStoreStateMachine.Event.OperationFailed) {
objectInStoreMgr.delete(this);
objectInStoreMgr.deleteIfNotReady(this);
}
}
}
@ -218,7 +218,7 @@ public class TemplateObject implements TemplateInfo {
} finally {
// in case of OperationFailed, expunge the entry
if (event == ObjectInDataStoreStateMachine.Event.OperationFailed) {
objectInStoreMgr.delete(this);
objectInStoreMgr.deleteIfNotReady(this);
}
}
}

View File

@ -160,7 +160,7 @@ public class SnapshotObject implements SnapshotInfo {
throw new CloudRuntimeException("Failed to update state: " + e.toString());
} finally {
if (event == ObjectInDataStoreStateMachine.Event.OperationFailed) {
objectInStoreMgr.delete(this);
objectInStoreMgr.deleteIfNotReady(this);
}
}
}
@ -267,13 +267,14 @@ public class SnapshotObject implements SnapshotInfo {
}
} catch (RuntimeException ex) {
if (event == ObjectInDataStoreStateMachine.Event.OperationFailed) {
objectInStoreMgr.delete(this);
objectInStoreMgr.deleteIfNotReady(this);
}
throw ex;
}
this.processEvent(event);
}
@Override
public void incRefCount() {
if (this.store == null) {
return;

View File

@ -31,6 +31,8 @@ public interface ObjectInDataStoreManager {
public boolean delete(DataObject dataObj);
public boolean deleteIfNotReady(DataObject dataObj);
public DataObject get(DataObject dataObj, DataStore store);
public boolean update(DataObject vo, Event event) throws NoTransitionException, ConcurrentOperationException;

View File

@ -232,6 +232,54 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager {
return false;
}
@Override
public boolean deleteIfNotReady(DataObject dataObj) {
long objId = dataObj.getId();
DataStore dataStore = dataObj.getDataStore();
if (dataStore.getRole() == DataStoreRole.Primary) {
if (dataObj.getType() == DataObjectType.TEMPLATE) {
VMTemplateStoragePoolVO destTmpltPool = templatePoolDao.findByPoolTemplate(dataStore.getId(), objId);
if (destTmpltPool != null && destTmpltPool.getState() != ObjectInDataStoreStateMachine.State.Ready) {
return templatePoolDao.remove(destTmpltPool.getId());
} else {
s_logger.warn("Template " + objId + " is not found on storage pool " + dataStore.getId() + ", so no need to delete");
return true;
}
}
} else {
// Image store
switch (dataObj.getType()) {
case TEMPLATE:
TemplateDataStoreVO destTmpltStore = templateDataStoreDao.findByStoreTemplate(dataStore.getId(), objId);
if (destTmpltStore != null && destTmpltStore.getState() != ObjectInDataStoreStateMachine.State.Ready) {
return templateDataStoreDao.remove(destTmpltStore.getId());
} else {
s_logger.warn("Template " + objId + " is not found on image store " + dataStore.getId() + ", so no need to delete");
return true;
}
case SNAPSHOT:
SnapshotDataStoreVO destSnapshotStore = snapshotDataStoreDao.findByStoreSnapshot(dataStore.getRole(), dataStore.getId(), objId);
if (destSnapshotStore != null && destSnapshotStore.getState() != ObjectInDataStoreStateMachine.State.Ready) {
return snapshotDataStoreDao.remove(destSnapshotStore.getId());
} else {
s_logger.warn("Snapshot " + objId + " is not found on image store " + dataStore.getId() + ", so no need to delete");
return true;
}
case VOLUME:
VolumeDataStoreVO destVolumeStore = volumeDataStoreDao.findByStoreVolume(dataStore.getId(), objId);
if (destVolumeStore != null && destVolumeStore.getState() != ObjectInDataStoreStateMachine.State.Ready) {
return volumeDataStoreDao.remove(destVolumeStore.getId());
} else {
s_logger.warn("Volume " + objId + " is not found on image store " + dataStore.getId() + ", so no need to delete");
return true;
}
}
}
s_logger.warn("Unsupported data object (" + dataObj.getType() + ", " + dataObj.getDataStore() + "), no need to delete from object in store ref table");
return false;
}
@Override
public boolean update(DataObject data, Event event) throws NoTransitionException, ConcurrentOperationException {
DataObjectInStore obj = this.findObject(data, data.getDataStore());

View File

@ -293,7 +293,7 @@ public class VolumeObject implements VolumeInfo {
// in case of OperationFailed, expunge the entry
if (event == ObjectInDataStoreStateMachine.Event.OperationFailed
&& (this.volumeVO.getState() != Volume.State.Copying && this.volumeVO.getState() != Volume.State.Uploaded)) {
objectInStoreMgr.delete(this);
objectInStoreMgr.deleteIfNotReady(this);
}
}
@ -309,7 +309,7 @@ public class VolumeObject implements VolumeInfo {
} finally {
// in case of OperationFailed, expunge the entry
if (event == ObjectInDataStoreStateMachine.Event.OperationFailed) {
objectInStoreMgr.delete(this);
objectInStoreMgr.deleteIfNotReady(this);
}
}
}
@ -504,7 +504,7 @@ public class VolumeObject implements VolumeInfo {
}
} catch (RuntimeException ex) {
if (event == ObjectInDataStoreStateMachine.Event.OperationFailed) {
objectInStoreMgr.delete(this);
objectInStoreMgr.deleteIfNotReady(this);
}
throw ex;
}
@ -593,7 +593,7 @@ public class VolumeObject implements VolumeInfo {
}
} catch (RuntimeException ex) {
if (event == ObjectInDataStoreStateMachine.Event.OperationFailed) {
objectInStoreMgr.delete(this);
objectInStoreMgr.deleteIfNotReady(this);
}
throw ex;
}