diff --git a/server/src/com/cloud/api/BaseCmd.java b/server/src/com/cloud/api/BaseCmd.java index 8760124bbc0..627e9626045 100755 --- a/server/src/com/cloud/api/BaseCmd.java +++ b/server/src/com/cloud/api/BaseCmd.java @@ -81,6 +81,7 @@ public abstract class BaseCmd { public static final int NET_CONFLICT_LB_RULE_ERROR = 568; public static final int NET_LIST_ERROR = 570; public static final int CUSTOM_CERT_UPDATE_ERROR = 571; + public static final int PREPARE_STORAGE_MAINTENANCE_ERROR = 572; public static final int STORAGE_RESOURCE_IN_USE = 580; public static final DateFormat INPUT_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 4ea120f25b8..bdca16e0c28 100644 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -1023,12 +1023,16 @@ public class ConfigurationManagerImpl implements ConfigurationManager { String guestCidr = cmd.getGuestCidrAddress(); String domain = cmd.getDomain(); Long domainId = cmd.getDomainId(); + DomainVO domainVO = null; if (userId == null) { userId = User.UID_SYSTEM; } - return createZone(userId, zoneName, dns1, dns2, internalDns1, internalDns2, vnetRange, guestCidr, domain, domainId); + if(domainId != null){ + domainVO = _domainDao.findById(domainId); + } + return createZone(userId, zoneName, dns1, dns2, internalDns1, internalDns2, vnetRange, guestCidr, domain != null ? domain : domainVO.getName(), domainId); } @Override diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index f8d61d4e92a..f2ceea99a9c 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -103,6 +103,7 @@ import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceInUseException; +import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.StorageUnavailableException; import com.cloud.host.Host; import com.cloud.host.HostVO; @@ -2144,32 +2145,44 @@ public class StorageManagerImpl implements StorageManager { Long primaryStorageId = cmd.getId(); Long userId = UserContext.current().getUserId(); boolean restart = true; + StoragePoolVO primaryStorage = null; try { + Transaction.currentTxn(); //1. Get the primary storage record and perform validation check - StoragePoolVO primaryStorage = _storagePoolDao.findById(primaryStorageId); - + primaryStorage = _storagePoolDao.acquireInLockTable(primaryStorageId); + + if(primaryStorage == null){ + String msg = "Unable to obtain lock on the storage pool in preparePrimaryStorageForMaintenance()"; + s_logger.error(msg); + throw new ResourceUnavailableException(msg); + } + + primaryStorage = _storagePoolDao.findById(primaryStorageId); if(primaryStorage == null) { s_logger.warn("The primary storage does not exist"); throw new InvalidParameterValueException("Primary storage doesn't exist"); } - if (!primaryStorage.getStatus().equals(Status.Up)) { - throw new InvalidParameterValueException("Primary storage with id " + primaryStorageId + " is not ready for migration, as the status is:" + primaryStorage.getStatus().toString()); - } - +// if (!primaryStorage.getStatus().equals(Status.Up)) { +// throw new InvalidParameterValueException("Primary storage with id " + primaryStorageId + " is not ready for migration, as the status is:" + primaryStorage.getStatus().toString()); +// } + //set the pool state to prepare for maintenance + primaryStorage.setStatus(Status.PrepareForMaintenance); + _storagePoolDao.persist(primaryStorage); + //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 List upPools = _storagePoolDao.listPoolsByStatus(Status.Up); - if(upPools==null || upPools.size()==0) + if(upPools == null || upPools.size() == 0) restart = false; //2. Get a list of all the volumes within this storage pool List allVolumes = _volsDao.findByPoolId(primaryStorageId); - + //3. Each volume has an instance associated with it, stop the instance if running for(VolumeVO volume : allVolumes) { @@ -2300,9 +2313,25 @@ public class StorageManagerImpl implements StorageManager { _storagePoolDao.persist(primaryStorage); return _storagePoolDao.findById(primaryStorageId); - } catch (Exception e) { //FIXME - catch specific exceptions here - s_logger.error("Exception in enabling primary storage maintenance:"+e); - throw new CloudRuntimeException("Exception in enabling primary storage maintenance:"+e); + } catch (Exception e) { + if(e instanceof ResourceUnavailableException){ + s_logger.error("Exception in enabling primary storage maintenance:",e); + throw new ServerApiException(BaseCmd.PREPARE_STORAGE_MAINTENANCE_ERROR, e.getMessage()); + } + if(e instanceof InvalidParameterValueException){ + s_logger.error("Exception in enabling primary storage maintenance:",e); + throw new ServerApiException(BaseCmd.PREPARE_STORAGE_MAINTENANCE_ERROR, e.getMessage()); + } + if(e instanceof CloudRuntimeException){ + s_logger.error("Exception in enabling primary storage maintenance:",e); + throw new ServerApiException(BaseCmd.PREPARE_STORAGE_MAINTENANCE_ERROR, e.getMessage()); + } + //for everything else + s_logger.error("Exception in enabling primary storage maintenance:",e); + throw new ServerApiException(BaseCmd.PREPARE_STORAGE_MAINTENANCE_ERROR, e.getMessage()); + + }finally{ + _storagePoolDao.releaseFromLockTable(primaryStorage.getId()); } }