Clean up template_zone_ref entries in case of create template failure.

This commit is contained in:
Min Chen 2013-05-21 12:00:59 -07:00
parent 8f549db518
commit 2af36aa87b
4 changed files with 35 additions and 18 deletions

View File

@ -23,11 +23,13 @@ import com.cloud.utils.db.GenericDao;
public interface VMTemplateZoneDao extends GenericDao<VMTemplateZoneVO, Long> { public interface VMTemplateZoneDao extends GenericDao<VMTemplateZoneVO, Long> {
public List<VMTemplateZoneVO> listByZoneId(long id); public List<VMTemplateZoneVO> listByZoneId(long id);
public List<VMTemplateZoneVO> listByTemplateId(long templateId); public List<VMTemplateZoneVO> listByTemplateId(long templateId);
public VMTemplateZoneVO findByZoneTemplate(long zoneId, long templateId); public VMTemplateZoneVO findByZoneTemplate(long zoneId, long templateId);
public List<VMTemplateZoneVO> listByZoneTemplate(Long zoneId, long templateId); public List<VMTemplateZoneVO> listByZoneTemplate(Long zoneId, long templateId);
public void deletePrimaryRecordsForTemplate(long templateId);
} }

View File

@ -20,6 +20,7 @@ import java.util.List;
import javax.ejb.Local; import javax.ejb.Local;
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -27,32 +28,33 @@ import com.cloud.storage.VMTemplateZoneVO;
import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
@Component @Component
@Local(value={VMTemplateZoneDao.class}) @Local(value={VMTemplateZoneDao.class})
public class VMTemplateZoneDaoImpl extends GenericDaoBase<VMTemplateZoneVO, Long> implements VMTemplateZoneDao { public class VMTemplateZoneDaoImpl extends GenericDaoBase<VMTemplateZoneVO, Long> implements VMTemplateZoneDao {
public static final Logger s_logger = Logger.getLogger(VMTemplateZoneDaoImpl.class.getName()); public static final Logger s_logger = Logger.getLogger(VMTemplateZoneDaoImpl.class.getName());
protected final SearchBuilder<VMTemplateZoneVO> ZoneSearch; protected final SearchBuilder<VMTemplateZoneVO> ZoneSearch;
protected final SearchBuilder<VMTemplateZoneVO> TemplateSearch; protected final SearchBuilder<VMTemplateZoneVO> TemplateSearch;
protected final SearchBuilder<VMTemplateZoneVO> ZoneTemplateSearch; protected final SearchBuilder<VMTemplateZoneVO> ZoneTemplateSearch;
public VMTemplateZoneDaoImpl () { public VMTemplateZoneDaoImpl () {
ZoneSearch = createSearchBuilder(); ZoneSearch = createSearchBuilder();
ZoneSearch.and("zone_id", ZoneSearch.entity().getZoneId(), SearchCriteria.Op.EQ); ZoneSearch.and("zone_id", ZoneSearch.entity().getZoneId(), SearchCriteria.Op.EQ);
ZoneSearch.done(); ZoneSearch.done();
TemplateSearch = createSearchBuilder(); TemplateSearch = createSearchBuilder();
TemplateSearch.and("template_id", TemplateSearch.entity().getTemplateId(), SearchCriteria.Op.EQ); TemplateSearch.and("template_id", TemplateSearch.entity().getTemplateId(), SearchCriteria.Op.EQ);
TemplateSearch.done(); TemplateSearch.done();
ZoneTemplateSearch = createSearchBuilder(); ZoneTemplateSearch = createSearchBuilder();
ZoneTemplateSearch.and("zone_id", ZoneTemplateSearch.entity().getZoneId(), SearchCriteria.Op.EQ); ZoneTemplateSearch.and("zone_id", ZoneTemplateSearch.entity().getZoneId(), SearchCriteria.Op.EQ);
ZoneTemplateSearch.and("template_id", ZoneTemplateSearch.entity().getTemplateId(), SearchCriteria.Op.EQ); ZoneTemplateSearch.and("template_id", ZoneTemplateSearch.entity().getTemplateId(), SearchCriteria.Op.EQ);
ZoneTemplateSearch.done(); ZoneTemplateSearch.done();
} }
@Override @Override
public List<VMTemplateZoneVO> listByZoneId(long id) { public List<VMTemplateZoneVO> listByZoneId(long id) {
@ -84,6 +86,19 @@ public class VMTemplateZoneDaoImpl extends GenericDaoBase<VMTemplateZoneVO, Long
} }
sc.setParameters("template_id", templateId); sc.setParameters("template_id", templateId);
return listBy(sc); return listBy(sc);
} }
@Override
public void deletePrimaryRecordsForTemplate(long templateId) {
SearchCriteria<VMTemplateZoneVO> sc = TemplateSearch.create();
sc.setParameters("template_id", templateId);
Transaction txn = Transaction.currentTxn();
txn.start();
remove(sc);
txn.commit();
}
} }

View File

@ -142,7 +142,7 @@ public class StorageCacheManagerImpl implements StorageCacheManager, Manager {
s_logger.debug("there is already one in the cache store"); s_logger.debug("there is already one in the cache store");
return objectInStoreMgr.get(data, cacheStore); return objectInStoreMgr.get(data, cacheStore);
} }
//TODO: consider multiple thread to create //TODO: consider multiple thread to create
DataObject objOnCacheStore = cacheStore.create(data); DataObject objOnCacheStore = cacheStore.create(data);
@ -155,7 +155,7 @@ public class StorageCacheManagerImpl implements StorageCacheManager, Manager {
result = future.get(); result = future.get();
if (result.isFailed()) { if (result.isFailed()) {
cacheStore.delete(data); objOnCacheStore.processEvent(Event.OperationFailed);
} else { } else {
objOnCacheStore.processEvent(Event.OperationSuccessed, result.getAnswer()); objOnCacheStore.processEvent(Event.OperationSuccessed, result.getAnswer());
return objOnCacheStore; return objOnCacheStore;
@ -168,7 +168,7 @@ public class StorageCacheManagerImpl implements StorageCacheManager, Manager {
s_logger.debug("create cache storage failed: " + e.toString()); s_logger.debug("create cache storage failed: " + e.toString());
} finally { } finally {
if (result == null) { if (result == null) {
cacheStore.delete(data); objOnCacheStore.processEvent(Event.OperationFailed);
} }
} }
@ -191,8 +191,7 @@ public class StorageCacheManagerImpl implements StorageCacheManager, Manager {
} }
@Override @Override
public DataObject deleteCacheObject(DataObject data) { public boolean deleteCacheObject(DataObject data) {
// TODO Auto-generated method stub return objectInStoreMgr.delete(data);
return null;
} }
} }

View File

@ -1456,8 +1456,9 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
if (privateTemplate == null) { if (privateTemplate == null) {
Transaction txn = Transaction.currentTxn(); Transaction txn = Transaction.currentTxn();
txn.start(); txn.start();
// Remove the template_store_ref record first, otherwise, we cannot remove the template record due to FK constraints // template_store_ref entries should have been removed using our DataObject.processEvent command in case of failure.
this._tmplStoreDao.deletePrimaryRecordsForTemplate(templateId); // Remove the template_zone_ref record
this._tmpltZoneDao.deletePrimaryRecordsForTemplate(templateId);
// Remove the template record // Remove the template record
this._tmpltDao.expunge(templateId); this._tmpltDao.expunge(templateId);