mirror of https://github.com/apache/cloudstack.git
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:
parent
5908a3931c
commit
a8990cffd4
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue