From d006fd141ce5c87f99c286ddcdc06ccbeec44e7a Mon Sep 17 00:00:00 2001 From: Abhinandan Prateek Date: Mon, 30 May 2011 12:39:15 +0530 Subject: [PATCH] bug 9909: upload manager support multiple secondary storage --- .../resource/NfsSecondaryStorageResource.java | 4 +-- .../storage/upload/UploadMonitorImpl.java | 25 +++++++++++++------ .../cloud/template/TemplateManagerImpl.java | 18 +++++++++---- 3 files changed, 32 insertions(+), 15 deletions(-) diff --git a/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java b/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java index 6f554d94553..04ba5353c63 100755 --- a/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java +++ b/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java @@ -539,8 +539,8 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S _params.put(StorageLayer.InstanceConfigKey, _storage); _dlMgr = new DownloadManagerImpl(); _dlMgr.configure("DownloadManager", _params); - //_upldMgr = new UploadManagerImpl(); - //_upldMgr.configure("UploadManager", params); + _upldMgr = new UploadManagerImpl(); + _upldMgr.configure("UploadManager", params); } catch (ConfigurationException e) { s_logger.warn("Caught problem while configuring DownloadManager", e); return false; diff --git a/server/src/com/cloud/storage/upload/UploadMonitorImpl.java b/server/src/com/cloud/storage/upload/UploadMonitorImpl.java index 3b87f714fa9..3809701ad48 100755 --- a/server/src/com/cloud/storage/upload/UploadMonitorImpl.java +++ b/server/src/com/cloud/storage/upload/UploadMonitorImpl.java @@ -200,11 +200,20 @@ public class UploadMonitorImpl implements UploadMonitor { Type type = (template.getFormat() == ImageFormat.ISO) ? Type.ISO : Type.TEMPLATE ; - //Check if ssvm is up - HostVO sserver = storageServers.get(0); - if(sserver.getStatus() != com.cloud.host.Status.Up){ - throw new CloudRuntimeException("Couldnt create extract link - Secondary Storage Vm is not up"); - } + List storageServerVMs = _serverDao.listByTypeDataCenter(Host.Type.SecondaryStorageVM, dataCenterId); + //Check if one ssvm is up + boolean no_vm_up = true; + HostVO use_ssvm = null; + for (HostVO ssvm: storageServerVMs){ + if(ssvm.getStatus() == com.cloud.host.Status.Up){ + no_vm_up = false; + use_ssvm = ssvm; + break; + } + } + if(no_vm_up){ + throw new CloudRuntimeException("Couldnt create extract link - Secondary Storage Vm is not up"); + } //Check if it already exists. List extractURLList = _uploadDao.listByTypeUploadStatus(template.getId(), type, UploadVO.Status.DOWNLOAD_URL_CREATED); @@ -213,7 +222,7 @@ public class UploadMonitorImpl implements UploadMonitor { } // It doesn't exist so create a DB entry. - UploadVO uploadTemplateObj = new UploadVO(sserver.getId(), template.getId(), new Date(), + UploadVO uploadTemplateObj = new UploadVO(use_ssvm.getId(), template.getId(), new Date(), Status.DOWNLOAD_URL_NOT_CREATED, 0, type, Mode.HTTP_DOWNLOAD); uploadTemplateObj.setInstallPath(vmTemplateHost.getInstallPath()); _uploadDao.persist(uploadTemplateObj); @@ -221,7 +230,7 @@ public class UploadMonitorImpl implements UploadMonitor { // Create Symlink at ssvm String uuid = UUID.randomUUID().toString() + ".vhd"; CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(vmTemplateHost.getInstallPath(), uuid); - long result = send(sserver.getId(), cmd, null); + long result = send(use_ssvm.getId(), cmd, null); if (result == -1){ errorString = "Unable to create a link for " +type+ " id:"+template.getId(); s_logger.error(errorString); @@ -230,7 +239,7 @@ public class UploadMonitorImpl implements UploadMonitor { //Construct actual URL locally now that the symlink exists at SSVM List ssVms = _secStorageVmDao.getSecStorageVmListInStates(SecondaryStorageVm.Role.templateProcessor, dataCenterId, State.Running); - if (ssVms.size() > 0) { + if (ssVms.size() > 0) { SecondaryStorageVmVO ssVm = ssVms.get(0); if (ssVm.getPublicIpAddress() == null) { errorString = "A running secondary storage vm has a null public ip?"; diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java index 32d9d4355d1..2388930c6c5 100755 --- a/server/src/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/com/cloud/template/TemplateManagerImpl.java @@ -262,12 +262,20 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe } } - HostVO secondaryStorageHost = _storageMgr.getSecondaryStorageHost(zoneId); + List sservers = _storageMgr.getSecondaryStorageHosts(zoneId); + VMTemplateHostVO tmpltHostRef = null; - if (secondaryStorageHost != null) { - tmpltHostRef = _tmpltHostDao.findByHostTemplate(secondaryStorageHost.getId(), templateId); - if (tmpltHostRef != null && tmpltHostRef.getDownloadState() != com.cloud.storage.VMTemplateStorageResourceAssoc.Status.DOWNLOADED) { - throw new InvalidParameterValueException("The " + desc + " has not been downloaded "); + if (sservers != null) { + for(HostVO secondaryStorageHost: sservers){ + tmpltHostRef = _tmpltHostDao.findByHostTemplate(secondaryStorageHost.getId(), templateId); + if (tmpltHostRef != null){ + if (tmpltHostRef.getDownloadState() != com.cloud.storage.VMTemplateStorageResourceAssoc.Status.DOWNLOADED) { + throw new InvalidParameterValueException("The " + desc + " has not been downloaded "); + } + else { + break; + } + } } }