bug 9550: get storagePool to Host mappings before doing processDisconnect because these references are being deleted as a part of processDisconnect call.

status 9550: resolved fixed
This commit is contained in:
alena 2011-04-23 18:30:16 -07:00
parent 074e143986
commit c8f4dacb0a
4 changed files with 2871 additions and 3426 deletions

File diff suppressed because it is too large Load Diff

View File

@ -650,7 +650,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
final HashSet<StoragePool> avoidPools = new HashSet<StoragePool>(avoids);
if (diskOffering != null && diskOffering.isCustomized()) {
diskOffering.setDiskSize(size/(1024*1024));
diskOffering.setDiskSize(size / (1024 * 1024));
}
DiskProfile dskCh = null;
if (volume.getVolumeType() == Type.ROOT && Storage.ImageFormat.ISO != template.getFormat()) {
@ -1301,18 +1301,18 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
}
private boolean deletePoolStats(Long poolId) {
CapacityVO capacity1 = _capacityDao.findByHostIdType(poolId, CapacityVO.CAPACITY_TYPE_STORAGE);
CapacityVO capacity2 = _capacityDao.findByHostIdType(poolId, CapacityVO.CAPACITY_TYPE_STORAGE_ALLOCATED);
CapacityVO capacity1 = _capacityDao.findByHostIdType(poolId, CapacityVO.CAPACITY_TYPE_STORAGE);
CapacityVO capacity2 = _capacityDao.findByHostIdType(poolId, CapacityVO.CAPACITY_TYPE_STORAGE_ALLOCATED);
Transaction txn = Transaction.currentTxn();
txn.start();
try {
if ( capacity1 != null ) {
if (capacity1 != null) {
_capacityDao.remove(capacity1.getId());
}
if ( capacity2 != null ) {
if (capacity2 != null) {
_capacityDao.remove(capacity2.getId());
}
} finally {
} finally {
txn.commit();
}
return true;
@ -1341,7 +1341,6 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
}
}
@Override
public boolean delPoolFromHost(long hostId) {
List<StoragePoolHostVO> poolHosts = _poolHostDao.listByHostId(hostId);
@ -1351,7 +1350,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
}
return true;
}
@Override
public boolean addPoolToHost(long hostId, StoragePoolVO pool) {
s_logger.debug("Adding pool " + pool.getName() + " to host " + hostId);
@ -2481,13 +2480,13 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
@Override
public void prepare(VirtualMachineProfile<? extends VirtualMachine> vm, DeployDestination dest) throws StorageUnavailableException, InsufficientStorageCapacityException {
if(dest == null){
if (dest == null) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("DeployDestination cannot be null, cannot prepare Volumes for the vm: "+ vm);
s_logger.debug("DeployDestination cannot be null, cannot prepare Volumes for the vm: " + vm);
}
throw new CloudRuntimeException("Unable to prepare Volume for vm because DeployDestination is null, vm:"+vm);
}
throw new CloudRuntimeException("Unable to prepare Volume for vm because DeployDestination is null, vm:" + vm);
}
List<VolumeVO> vols = _volsDao.findUsableVolumesForInstance(vm.getId());
if (s_logger.isDebugEnabled()) {
s_logger.debug("Preparing " + vols.size() + " volumes for " + vm);
@ -2496,35 +2495,35 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag
List<VolumeVO> recreateVols = new ArrayList<VolumeVO>(vols.size());
for (VolumeVO vol : vols) {
StoragePool assignedPool = null;
if(dest.getStorageForDisks() != null){
assignedPool = dest.getStorageForDisks().get(vol);
}
if(assignedPool != null){
Volume.State state = vol.getState();
if(state == Volume.State.Allocated){
recreateVols.add(vol);
}else{
if (vol.isRecreatable()) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Volume " + vol + " will be recreated on storage pool " + assignedPool + " assigned by deploymentPlanner");
}
recreateVols.add(vol);
}else{
if (s_logger.isDebugEnabled()) {
s_logger.debug("Volume " + vol + " is not recreatable! Cannot recreate on storagepool: "+assignedPool);
}
throw new StorageUnavailableException("Volume is not recreatable, Unable to create " + vol, Volume.class, vol.getId());
//copy volume usecase - not yet developed.
}
}
}else{
if(vol.getPoolId() == null){
throw new StorageUnavailableException("Volume has no pool associate and also no storage pool assigned in DeployDestination, Unable to create " + vol, Volume.class, vol.getId());
}
StoragePoolVO pool = _storagePoolDao.findById(vol.getPoolId());
vm.addDisk(new VolumeTO(vol, pool));
}
StoragePool assignedPool = null;
if (dest.getStorageForDisks() != null) {
assignedPool = dest.getStorageForDisks().get(vol);
}
if (assignedPool != null) {
Volume.State state = vol.getState();
if (state == Volume.State.Allocated) {
recreateVols.add(vol);
} else {
if (vol.isRecreatable()) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Volume " + vol + " will be recreated on storage pool " + assignedPool + " assigned by deploymentPlanner");
}
recreateVols.add(vol);
} else {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Volume " + vol + " is not recreatable! Cannot recreate on storagepool: " + assignedPool);
}
throw new StorageUnavailableException("Volume is not recreatable, Unable to create " + vol, Volume.class, vol.getId());
// copy volume usecase - not yet developed.
}
}
} else {
if (vol.getPoolId() == null) {
throw new StorageUnavailableException("Volume has no pool associate and also no storage pool assigned in DeployDestination, Unable to create " + vol, Volume.class, vol.getId());
}
StoragePoolVO pool = _storagePoolDao.findById(vol.getPoolId());
vm.addDisk(new VolumeTO(vol, pool));
}
}
for (VolumeVO vol : recreateVols) {

View File

@ -16,31 +16,27 @@
*
*/
package com.cloud.storage.dao;
import java.util.ArrayList;
import java.util.List;
package com.cloud.storage.dao;
import java.util.List;
import com.cloud.host.Status;
import com.cloud.storage.StoragePoolHostVO;
import com.cloud.utils.Pair;
import com.cloud.utils.db.GenericDao;
import com.cloud.utils.db.Transaction;
public interface StoragePoolHostDao extends GenericDao<StoragePoolHostVO, Long> {
public List<StoragePoolHostVO> listByPoolId(long id);
public List<StoragePoolHostVO> listByHostId(long hostId);
public StoragePoolHostVO findByPoolHost(long poolId, long hostId);
List<StoragePoolHostVO> listByHostStatus(long poolId, Status hostStatus);
List<Pair<Long, Integer>> getDatacenterStoragePoolHostInfo(long dcId, boolean sharedOnly);
public ArrayList<Long> getPoolIds(Long hostId);
public void deletePrimaryRecordsForHost(long hostId);
public void deleteStoragePoolHostDetails(long hostId, long poolId);
}
public interface StoragePoolHostDao extends GenericDao<StoragePoolHostVO, Long> {
public List<StoragePoolHostVO> listByPoolId(long id);
public List<StoragePoolHostVO> listByHostId(long hostId);
public StoragePoolHostVO findByPoolHost(long poolId, long hostId);
List<StoragePoolHostVO> listByHostStatus(long poolId, Status hostStatus);
List<Pair<Long, Integer>> getDatacenterStoragePoolHostInfo(long dcId, boolean sharedOnly);
public void deletePrimaryRecordsForHost(long hostId);
public void deleteStoragePoolHostDetails(long hostId, long poolId);
}

View File

@ -16,8 +16,8 @@
*
*/
package com.cloud.storage.dao;
package com.cloud.storage.dao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@ -31,213 +31,147 @@ import org.apache.log4j.Logger;
import com.cloud.host.Status;
import com.cloud.storage.StoragePoolHostVO;
import com.cloud.utils.Pair;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
@Local(value={StoragePoolHostDao.class})
public class StoragePoolHostDaoImpl extends GenericDaoBase<StoragePoolHostVO, Long> implements StoragePoolHostDao {
public static final Logger s_logger = Logger.getLogger(StoragePoolHostDaoImpl.class.getName());
protected final SearchBuilder<StoragePoolHostVO> PoolSearch;
protected final SearchBuilder<StoragePoolHostVO> HostSearch;
protected final SearchBuilder<StoragePoolHostVO> PoolHostSearch;
protected static final String HOST_FOR_POOL_SEARCH=
"SELECT * FROM storage_pool_host_ref ph, host h where ph.host_id = h.id and ph.pool_id=? and h.status=? ";
protected static final String STORAGE_POOL_HOST_INFO =
"SELECT p.data_center_id, count(ph.host_id) " +
" FROM storage_pool p, storage_pool_host_ref ph " +
" WHERE p.id = ph.pool_id AND p.data_center_id = ? " +
" GROUP by p.data_center_id";
protected static final String SHARED_STORAGE_POOL_HOST_INFO =
"SELECT p.data_center_id, count(ph.host_id) " +
" FROM storage_pool p, storage_pool_host_ref ph " +
" WHERE p.id = ph.pool_id AND p.data_center_id = ? " +
" AND p.pool_type NOT IN ('LVM', 'Filesystem')" +
" GROUP by p.data_center_id";
protected static final String GET_POOL_IDS =
"SELECT pool_id "+
"FROM storage_pool_host_ref "+
"WHERE host_id = ?";
protected static final String DELETE_PRIMARY_RECORDS =
"DELETE "+
"FROM storage_pool_host_ref "+
"WHERE host_id = ?";
public StoragePoolHostDaoImpl () {
PoolSearch = createSearchBuilder();
PoolSearch.and("pool_id", PoolSearch.entity().getPoolId(), SearchCriteria.Op.EQ);
PoolSearch.done();
HostSearch = createSearchBuilder();
HostSearch.and("host_id", HostSearch.entity().getHostId(), SearchCriteria.Op.EQ);
HostSearch.done();
PoolHostSearch = createSearchBuilder();
PoolHostSearch.and("pool_id", PoolHostSearch.entity().getPoolId(), SearchCriteria.Op.EQ);
PoolHostSearch.and("host_id", PoolHostSearch.entity().getHostId(), SearchCriteria.Op.EQ);
PoolHostSearch.done();
}
@Override
public List<StoragePoolHostVO> listByPoolId(long id) {
SearchCriteria<StoragePoolHostVO> sc = PoolSearch.create();
sc.setParameters("pool_id", id);
return listIncludingRemovedBy(sc);
}
@Override
public List<StoragePoolHostVO> listByHostId(long hostId) {
SearchCriteria<StoragePoolHostVO> sc = HostSearch.create();
sc.setParameters("host_id", hostId);
return listIncludingRemovedBy(sc);
}
@Override
public StoragePoolHostVO findByPoolHost(long poolId, long hostId) {
SearchCriteria<StoragePoolHostVO> sc = PoolHostSearch.create();
sc.setParameters("pool_id", poolId);
sc.setParameters("host_id", hostId);
return findOneIncludingRemovedBy(sc);
}
@Override
public List<StoragePoolHostVO> listByHostStatus(long poolId, Status hostStatus) {
Transaction txn = Transaction.currentTxn();
PreparedStatement pstmt = null;
List<StoragePoolHostVO> result = new ArrayList<StoragePoolHostVO>();
ResultSet rs = null;
try {
String sql = HOST_FOR_POOL_SEARCH;
pstmt = txn.prepareStatement(sql);
pstmt.setLong(1, poolId);
pstmt.setString(2, hostStatus.toString());
rs = pstmt.executeQuery();
while (rs.next()) {
// result.add(toEntityBean(rs, false)); TODO: this is buggy in GenericDaoBase for hand constructed queries
long id = rs.getLong(1); //ID column
result.add(findById(id));
}
} catch (Exception e) {
s_logger.warn("Exception: ", e);
} finally {
try {
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
} catch (SQLException e) {
}
}
return result;
}
@Override
public List<Pair<Long, Integer>> getDatacenterStoragePoolHostInfo(long dcId, boolean sharedOnly) {
ArrayList<Pair<Long, Integer>> l = new ArrayList<Pair<Long, Integer>>();
String sql = sharedOnly?SHARED_STORAGE_POOL_HOST_INFO:STORAGE_POOL_HOST_INFO;
Transaction txn = Transaction.currentTxn();;
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement(sql);
pstmt.setLong(1, dcId);
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
l.add(new Pair<Long, Integer>(rs.getLong(1), rs.getInt(2)));
}
} catch (SQLException e) {
} catch (Throwable e) {
}
return l;
}
/**
* This method returns the pool_ids associated with the host
* @param hostId -- id for the host
* @return -- list of pool ids
*/
@DB
public ArrayList<Long> getPoolIds(Long hostId)
{
ArrayList<Long> poolIdsList = new ArrayList<Long>();
Transaction txn = Transaction.currentTxn();
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
String sql = GET_POOL_IDS;
pstmt = txn.prepareStatement(sql);
pstmt.setLong(1, hostId);
rs = pstmt.executeQuery();
while (rs.next())
{
poolIdsList.add(rs.getLong(1));
}
}
catch (Exception e)
{
s_logger.warn("Exception getting pool ids: ", e);
}
finally
{
try
{
if (rs != null)
{
rs.close();
}
if (pstmt != null)
{
pstmt.close();
}
}
catch (SQLException e)
{
}
}
return poolIdsList;
}
@Local(value = { StoragePoolHostDao.class })
public class StoragePoolHostDaoImpl extends GenericDaoBase<StoragePoolHostVO, Long> implements StoragePoolHostDao {
public static final Logger s_logger = Logger.getLogger(StoragePoolHostDaoImpl.class.getName());
/**
* This method deletes the primary records from the host
* @param hostId -- id of the host
*/
public void deletePrimaryRecordsForHost(long hostId)
{
SearchCriteria<StoragePoolHostVO> sc = HostSearch.create();
sc.setParameters("host_id", hostId);
Transaction txn = Transaction.currentTxn();
txn.start();
remove(sc);
txn.commit();
}
protected final SearchBuilder<StoragePoolHostVO> PoolSearch;
protected final SearchBuilder<StoragePoolHostVO> HostSearch;
protected final SearchBuilder<StoragePoolHostVO> PoolHostSearch;
protected static final String HOST_FOR_POOL_SEARCH = "SELECT * FROM storage_pool_host_ref ph, host h where ph.host_id = h.id and ph.pool_id=? and h.status=? ";
protected static final String STORAGE_POOL_HOST_INFO = "SELECT p.data_center_id, count(ph.host_id) " + " FROM storage_pool p, storage_pool_host_ref ph "
+ " WHERE p.id = ph.pool_id AND p.data_center_id = ? " + " GROUP by p.data_center_id";
@Override
public void deleteStoragePoolHostDetails(long hostId, long poolId) {
SearchCriteria<StoragePoolHostVO> sc = PoolHostSearch.create();
sc.setParameters("host_id", hostId);
sc.setParameters("pool_id", poolId);
Transaction txn = Transaction.currentTxn();
txn.start();
remove(sc);
txn.commit();
}
}
protected static final String SHARED_STORAGE_POOL_HOST_INFO = "SELECT p.data_center_id, count(ph.host_id) " + " FROM storage_pool p, storage_pool_host_ref ph "
+ " WHERE p.id = ph.pool_id AND p.data_center_id = ? " + " AND p.pool_type NOT IN ('LVM', 'Filesystem')" + " GROUP by p.data_center_id";
protected static final String DELETE_PRIMARY_RECORDS = "DELETE " + "FROM storage_pool_host_ref " + "WHERE host_id = ?";
public StoragePoolHostDaoImpl() {
PoolSearch = createSearchBuilder();
PoolSearch.and("pool_id", PoolSearch.entity().getPoolId(), SearchCriteria.Op.EQ);
PoolSearch.done();
HostSearch = createSearchBuilder();
HostSearch.and("host_id", HostSearch.entity().getHostId(), SearchCriteria.Op.EQ);
HostSearch.done();
PoolHostSearch = createSearchBuilder();
PoolHostSearch.and("pool_id", PoolHostSearch.entity().getPoolId(), SearchCriteria.Op.EQ);
PoolHostSearch.and("host_id", PoolHostSearch.entity().getHostId(), SearchCriteria.Op.EQ);
PoolHostSearch.done();
}
@Override
public List<StoragePoolHostVO> listByPoolId(long id) {
SearchCriteria<StoragePoolHostVO> sc = PoolSearch.create();
sc.setParameters("pool_id", id);
return listIncludingRemovedBy(sc);
}
@Override
public List<StoragePoolHostVO> listByHostId(long hostId) {
SearchCriteria<StoragePoolHostVO> sc = HostSearch.create();
sc.setParameters("host_id", hostId);
return listIncludingRemovedBy(sc);
}
@Override
public StoragePoolHostVO findByPoolHost(long poolId, long hostId) {
SearchCriteria<StoragePoolHostVO> sc = PoolHostSearch.create();
sc.setParameters("pool_id", poolId);
sc.setParameters("host_id", hostId);
return findOneIncludingRemovedBy(sc);
}
@Override
public List<StoragePoolHostVO> listByHostStatus(long poolId, Status hostStatus) {
Transaction txn = Transaction.currentTxn();
PreparedStatement pstmt = null;
List<StoragePoolHostVO> result = new ArrayList<StoragePoolHostVO>();
ResultSet rs = null;
try {
String sql = HOST_FOR_POOL_SEARCH;
pstmt = txn.prepareStatement(sql);
pstmt.setLong(1, poolId);
pstmt.setString(2, hostStatus.toString());
rs = pstmt.executeQuery();
while (rs.next()) {
// result.add(toEntityBean(rs, false)); TODO: this is buggy in GenericDaoBase for hand constructed queries
long id = rs.getLong(1); // ID column
result.add(findById(id));
}
} catch (Exception e) {
s_logger.warn("Exception: ", e);
} finally {
try {
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
} catch (SQLException e) {
}
}
return result;
}
@Override
public List<Pair<Long, Integer>> getDatacenterStoragePoolHostInfo(long dcId, boolean sharedOnly) {
ArrayList<Pair<Long, Integer>> l = new ArrayList<Pair<Long, Integer>>();
String sql = sharedOnly ? SHARED_STORAGE_POOL_HOST_INFO : STORAGE_POOL_HOST_INFO;
Transaction txn = Transaction.currentTxn();
;
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement(sql);
pstmt.setLong(1, dcId);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
l.add(new Pair<Long, Integer>(rs.getLong(1), rs.getInt(2)));
}
} catch (SQLException e) {
} catch (Throwable e) {
}
return l;
}
/**
* This method deletes the primary records from the host
*
* @param hostId
* -- id of the host
*/
@Override
public void deletePrimaryRecordsForHost(long hostId) {
SearchCriteria<StoragePoolHostVO> sc = HostSearch.create();
sc.setParameters("host_id", hostId);
Transaction txn = Transaction.currentTxn();
txn.start();
remove(sc);
txn.commit();
}
@Override
public void deleteStoragePoolHostDetails(long hostId, long poolId) {
SearchCriteria<StoragePoolHostVO> sc = PoolHostSearch.create();
sc.setParameters("host_id", hostId);
sc.setParameters("pool_id", poolId);
Transaction txn = Transaction.currentTxn();
txn.start();
remove(sc);
txn.commit();
}
}