From 93261c4eb8d075d7b80df74256771ed9e2254944 Mon Sep 17 00:00:00 2001 From: abhishek Date: Fri, 10 Sep 2010 13:43:37 -0700 Subject: [PATCH] bug 5147: Improvements after testing the storage maintenance across multiple sp's, with sys vms scattered across multiple sps --- core/src/com/cloud/storage/dao/StoragePoolDao.java | 2 ++ .../com/cloud/storage/dao/StoragePoolDaoImpl.java | 12 ++++++++++++ .../src/com/cloud/api/commands/CreateVolumeCmd.java | 3 ++- .../src/com/cloud/server/ManagementServerImpl.java | 7 ++++++- server/src/com/cloud/storage/StorageManagerImpl.java | 10 ++++++---- 5 files changed, 28 insertions(+), 6 deletions(-) diff --git a/core/src/com/cloud/storage/dao/StoragePoolDao.java b/core/src/com/cloud/storage/dao/StoragePoolDao.java index 85b5b33b40e..06d10c88b8a 100644 --- a/core/src/com/cloud/storage/dao/StoragePoolDao.java +++ b/core/src/com/cloud/storage/dao/StoragePoolDao.java @@ -103,5 +103,7 @@ public interface StoragePoolDao extends GenericDao { long countBy(long podId, Status... statuses); List findIfDuplicatePoolsExistByUUID(String uuid); + + List listPoolsByStatus(Status status); } diff --git a/core/src/com/cloud/storage/dao/StoragePoolDaoImpl.java b/core/src/com/cloud/storage/dao/StoragePoolDaoImpl.java index 12a1c8cc799..a5d716b16ae 100644 --- a/core/src/com/cloud/storage/dao/StoragePoolDaoImpl.java +++ b/core/src/com/cloud/storage/dao/StoragePoolDaoImpl.java @@ -59,6 +59,7 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp protected final SearchBuilder HostPathDcSearch; protected final SearchBuilder DcPodAnyClusterSearch; protected final SearchBuilder DeleteLvmSearch; + protected final SearchBuilder StatusSearch; protected final GenericSearchBuilder MaintenanceCountSearch; @@ -109,6 +110,10 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp HostSearch.and("host", HostSearch.entity().getHostAddress(), SearchCriteria.Op.EQ); HostSearch.done(); + StatusSearch = createSearchBuilder(); + StatusSearch.and("status",StatusSearch.entity().getStatus(),SearchCriteria.Op.EQ); + StatusSearch.done(); + HostPathDcPodSearch = createSearchBuilder(); HostPathDcPodSearch.and("hostAddress", HostPathDcPodSearch.entity().getHostAddress(), SearchCriteria.Op.EQ); HostPathDcPodSearch.and("path", HostPathDcPodSearch.entity().getPath(), SearchCriteria.Op.EQ); @@ -183,6 +188,13 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp sc.setParameters("host", hostFqdnOrIp); return listBy(sc); } + + @Override + public List listPoolsByStatus(Status status){ + SearchCriteria sc = StatusSearch.create(); + sc.setParameters("status", status); + return listBy(sc); + } @Override public StoragePoolVO findPoolByHostPath(long datacenterId, Long podId, String host, String path) { diff --git a/server/src/com/cloud/api/commands/CreateVolumeCmd.java b/server/src/com/cloud/api/commands/CreateVolumeCmd.java index 2733228d4e4..360c7e45087 100644 --- a/server/src/com/cloud/api/commands/CreateVolumeCmd.java +++ b/server/src/com/cloud/api/commands/CreateVolumeCmd.java @@ -185,8 +185,9 @@ public class CreateVolumeCmd extends BaseCmd { if(s_logger.isDebugEnabled()) s_logger.debug("CreateVolume command has been accepted, job id: " + jobId); } - + long volumeId = waitInstanceCreation(jobId); + List> returnValues = new ArrayList>(); returnValues.add(new Pair(BaseCmd.Properties.JOB_ID.getName(), Long.valueOf(jobId))); returnValues.add(new Pair(BaseCmd.Properties.VOLUME_ID.getName(), Long.valueOf(volumeId))); diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index e826a2edc9d..c12c146badf 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -8722,7 +8722,12 @@ public class ManagementServerImpl implements ManagementServer { @Override public long getPsMaintenanceCount(long podId){ - return _poolDao.countBy(podId, Status.Maintenance); + List poolsInMaintenance = _poolDao.listPoolsByStatus(Status.Maintenance); + + if(poolsInMaintenance==null) + return 0; + else + return poolsInMaintenance.size(); } } diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index ddf4d493045..864825ed87a 100644 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -440,7 +440,9 @@ public class StorageManagerImpl implements StorageManager { for (StoragePoolHostVO poolHost: poolHosts) { try { - return _agentMgr.send(poolHost.getHostId(), cmds, stopOnError); + Answer[] answerRet = _agentMgr.send(poolHost.getHostId(), cmds, stopOnError); + return answerRet; + } catch (AgentUnavailableException e) { s_logger.debug("Moving on because unable to send to " + poolHost.getHostId() + " due to " + e.getMessage()); } catch (OperationTimedoutException e) { @@ -1664,7 +1666,7 @@ public class StorageManagerImpl implements StorageManager { _asyncMgr.updateAsyncJobAttachment(job.getId(), "volume", volume.getId()); _asyncMgr.updateAsyncJobStatus(job.getId(), BaseCmd.PROGRESS_INSTANCE_CREATED, volume.getId()); } - + List poolsToAvoid = new ArrayList(); Set podsToAvoid = new HashSet(); Pair pod = null; @@ -2007,9 +2009,9 @@ public class StorageManagerImpl implements StorageManager { //check to see if other ps exist //if they do, then we can migrate over the system vms to them //if they dont, then just stop all vms on this one - count = _storagePoolDao.countBy(primaryStorage.getPodId(), Status.Up); + List upPools = _storagePoolDao.listPoolsByStatus(Status.Up); - if(count == 0) + if(upPools==null || upPools.size()==0) restart = false; //2. Get a list of all the volumes within this storage pool