diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index c2871d9f4d8..92d8c7bc606 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -313,6 +313,7 @@ import org.apache.cloudstack.api.command.user.vpc.*; import org.apache.cloudstack.api.command.user.vpn.*; import org.apache.cloudstack.api.command.user.zone.ListZonesByCmd; import org.apache.cloudstack.api.response.ExtractResponse; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; @@ -2673,8 +2674,8 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe long accountId = volume.getAccountId(); StoragePool srcPool = (StoragePool)this.dataStoreMgr.getPrimaryDataStore(volume.getPoolId()); - HostVO sserver = this.templateMgr.getSecondaryStorageHost(zoneId); - String secondaryStorageURL = sserver.getStorageUrl(); + DataStore secStore = this.dataStoreMgr.getImageStore(zoneId); + String secondaryStorageURL = secStore.getUri(); List extractURLList = _uploadDao.listByTypeUploadStatus(volumeId, Upload.Type.VOLUME, UploadVO.Status.DOWNLOAD_URL_CREATED); @@ -2682,7 +2683,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe return extractURLList.get(0).getId(); // If download url already // exists then return } else { - UploadVO uploadJob = _uploadMonitor.createNewUploadEntry(sserver.getId(), volumeId, UploadVO.Status.COPY_IN_PROGRESS, Upload.Type.VOLUME, + UploadVO uploadJob = _uploadMonitor.createNewUploadEntry(secStore.getId(), volumeId, UploadVO.Status.COPY_IN_PROGRESS, Upload.Type.VOLUME, url, extractMode); s_logger.debug("Extract Mode - " + uploadJob.getMode()); uploadJob = _uploadDao.createForUpdate(uploadJob.getId()); @@ -2740,7 +2741,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe if (extractMode == Mode.FTP_UPLOAD) { // Now that the volume is // copied perform the actual // uploading - _uploadMonitor.extractVolume(uploadJob, sserver, volume, url, zoneId, volumeLocalPath, cmd.getStartEventId(), job.getId(), _asyncMgr); + _uploadMonitor.extractVolume(uploadJob, secStore, volume, url, zoneId, volumeLocalPath, cmd.getStartEventId(), job.getId(), _asyncMgr); return uploadJob.getId(); } else { // Volume is copied now make it visible under apache and // create a URL. diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java index a7842fadbbf..624d1d5af95 100755 --- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java +++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java @@ -358,8 +358,7 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager, VolumeVO volume = _volsDao.findById(volumeId); Long dcId = volume.getDataCenterId(); Long accountId = volume.getAccountId(); - HostVO secHost = this.templateMgr.getSecondaryStorageHost(dcId); - String secondaryStoragePoolUrl = secHost.getStorageUrl(); + DataStore secStore = this.dataStoreMgr.getImageStore(dcId); Long swiftId = ss.getSwiftId(); SwiftTO swift = _swiftMgr.getSwiftTO(swiftId); @@ -376,7 +375,7 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager, String parent = null; try { for (String backupUuid : BackupUuids) { - downloadSnapshotFromSwiftCommand cmd = new downloadSnapshotFromSwiftCommand(swift, secondaryStoragePoolUrl, dcId, accountId, volumeId, parent, backupUuid, _backupsnapshotwait); + downloadSnapshotFromSwiftCommand cmd = new downloadSnapshotFromSwiftCommand(swift, secStore.getUri(), dcId, accountId, volumeId, parent, backupUuid, _backupsnapshotwait); Answer answer = _agentMgr.sendToSSVM(dcId, cmd); if ((answer == null) || !answer.getResult()) { throw new CloudRuntimeException("downloadSnapshotsFromSwift failed "); @@ -409,7 +408,7 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager, final VolumeVO volume = _volsDao.findById(snapshot.getVolumeId()); final Long zoneId = volume.getDataCenterId(); - final HostVO secHost = this.templateMgr.getSecondaryStorageHost(zoneId); + final DataStore secStore = this.dataStoreMgr.getImageStore(zoneId); final S3TO s3 = _s3Mgr.getS3TO(snapshot.getS3Id()); final List backupUuids = determineBackupUuids(snapshot); @@ -418,7 +417,7 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager, String parent = null; for (final String backupUuid : backupUuids) { final DownloadSnapshotFromS3Command cmd = new DownloadSnapshotFromS3Command( - s3, parent, secHost.getStorageUrl(), zoneId, + s3, parent, secStore.getUri(), zoneId, volume.getAccountId(), volume.getId(), backupUuid, _backupsnapshotwait); final Answer answer = _agentMgr.sendToSSVM(zoneId, cmd); diff --git a/server/src/com/cloud/storage/upload/UploadListener.java b/server/src/com/cloud/storage/upload/UploadListener.java index 891610f46f6..8d9cbb64102 100755 --- a/server/src/com/cloud/storage/upload/UploadListener.java +++ b/server/src/com/cloud/storage/upload/UploadListener.java @@ -24,6 +24,8 @@ import java.util.Map; import java.util.Timer; import java.util.TimerTask; +import javax.inject.Inject; + import org.apache.cloudstack.api.command.user.iso.ExtractIsoCmd; import org.apache.cloudstack.api.command.user.volume.ExtractVolumeCmd; import org.apache.log4j.Level; @@ -42,6 +44,9 @@ import com.cloud.agent.api.storage.UploadProgressCommand; import com.cloud.agent.api.storage.UploadProgressCommand.RequestType; import org.apache.cloudstack.api.command.user.template.ExtractTemplateCmd; import org.apache.cloudstack.api.response.ExtractResponse; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; +import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; +import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector; import com.cloud.api.ApiDBUtils; import com.cloud.async.AsyncJobManager; @@ -109,7 +114,7 @@ public class UploadListener implements Listener { } - private HostVO sserver; + private DataStore sserver; private boolean uploadActive = true; @@ -134,6 +139,7 @@ public class UploadListener implements Listener { private long eventId; private AsyncJobManager asyncMgr; private ExtractResponse resultObj; + @Inject EndPointSelector _epSelector; public AsyncJobManager getAsyncMgr() { return asyncMgr; @@ -162,7 +168,7 @@ public class UploadListener implements Listener { private final Map stateMap = new HashMap(); private Long uploadId; - public UploadListener(HostVO host, Timer _timer, UploadDao uploadDao, + public UploadListener(DataStore host, Timer _timer, UploadDao uploadDao, UploadVO uploadObj, UploadMonitorImpl uploadMonitor, UploadCommand cmd, Long accountId, String typeName, Type type, long eventId, long asyncJobId, AsyncJobManager asyncMgr) { this.sserver = host; @@ -272,7 +278,7 @@ public class UploadListener implements Listener { public void setUploadInactive(Status reason) { uploadActive=false; - uploadMonitor.handleUploadEvent(sserver, accountId, typeName, type, uploadId, reason, eventId); + uploadMonitor.handleUploadEvent(accountId, typeName, type, uploadId, reason, eventId); } public void logUploadStart() { @@ -430,8 +436,9 @@ public class UploadListener implements Listener { log("Sending progress command ", Level.TRACE); } try { - uploadMonitor.send(sserver.getId(), new UploadProgressCommand(getCommand(), getJobId(), reqType), this); - } catch (AgentUnavailableException e) { + EndPoint ep = _epSelector.select(sserver); + ep.sendMessageAsyncWithListener(new UploadProgressCommand(getCommand(), getJobId(), reqType), this); + } catch (Exception e) { s_logger.debug("Send command failed", e); setDisconnected(); } diff --git a/server/src/com/cloud/storage/upload/UploadMonitor.java b/server/src/com/cloud/storage/upload/UploadMonitor.java index dd50d1ae40f..4e410480312 100755 --- a/server/src/com/cloud/storage/upload/UploadMonitor.java +++ b/server/src/com/cloud/storage/upload/UploadMonitor.java @@ -17,6 +17,7 @@ package com.cloud.storage.upload; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; import com.cloud.async.AsyncJobManager; @@ -48,7 +49,7 @@ public interface UploadMonitor extends Manager{ UploadVO createNewUploadEntry(Long hostId, Long typeId, Status uploadState, Type type, String errorString, Mode extractMode); - void extractVolume(UploadVO uploadVolumeObj, HostVO sserver, VolumeVO volume, String url, + void extractVolume(UploadVO uploadVolumeObj, DataStore secStore, VolumeVO volume, String url, Long dataCenterId, String installPath, long eventId, long asyncJobId, AsyncJobManager asyncMgr); diff --git a/server/src/com/cloud/storage/upload/UploadMonitorImpl.java b/server/src/com/cloud/storage/upload/UploadMonitorImpl.java index 3f07cba1b75..0d0883e4859 100755 --- a/server/src/com/cloud/storage/upload/UploadMonitorImpl.java +++ b/server/src/com/cloud/storage/upload/UploadMonitorImpl.java @@ -156,20 +156,21 @@ public class UploadMonitorImpl extends ManagerBase implements UploadMonitor { } @Override - public void extractVolume(UploadVO uploadVolumeObj, HostVO sserver, VolumeVO volume, String url, Long dataCenterId, String installPath, long eventId, long asyncJobId, AsyncJobManager asyncMgr){ + public void extractVolume(UploadVO uploadVolumeObj, DataStore secStore, VolumeVO volume, String url, Long dataCenterId, String installPath, long eventId, long asyncJobId, AsyncJobManager asyncMgr){ uploadVolumeObj.setUploadState(Upload.Status.NOT_UPLOADED); _uploadDao.update(uploadVolumeObj.getId(), uploadVolumeObj); start(); UploadCommand ucmd = new UploadCommand(url, volume.getId(), volume.getSize(), installPath, Type.VOLUME); - UploadListener ul = new UploadListener(sserver, _timer, _uploadDao, uploadVolumeObj, this, ucmd, volume.getAccountId(), volume.getName(), Type.VOLUME, eventId, asyncJobId, asyncMgr); + UploadListener ul = new UploadListener(secStore, _timer, _uploadDao, uploadVolumeObj, this, ucmd, volume.getAccountId(), volume.getName(), Type.VOLUME, eventId, asyncJobId, asyncMgr); _listenerMap.put(uploadVolumeObj, ul); try { - send(sserver.getId(), ucmd, ul); - } catch (AgentUnavailableException e) { - s_logger.warn("Unable to start upload of volume " + volume.getName() + " from " + sserver.getName() + " to " +url, e); + EndPoint ep = _epSelector.select(secStore); + ep.sendMessageAsyncWithListener(ucmd, ul); + } catch (Exception e) { + s_logger.warn("Unable to start upload of volume " + volume.getName() + " from " + secStore.getName() + " to " +url, e); ul.setDisconnected(); ul.scheduleStatusCheck(RequestType.GET_OR_RESTART); } @@ -181,23 +182,22 @@ public class UploadMonitorImpl extends ManagerBase implements UploadMonitor { Type type = (template.getFormat() == ImageFormat.ISO) ? Type.ISO : Type.TEMPLATE ; - List storageServers = _resourceMgr.listAllHostsInOneZoneByType(Host.Type.SecondaryStorage, dataCenterId); - HostVO sserver = storageServers.get(0); + DataStore secStore = this.storeMgr.getImageStore(dataCenterId); - UploadVO uploadTemplateObj = new UploadVO(sserver.getId(), template.getId(), new Date(), + UploadVO uploadTemplateObj = new UploadVO(secStore.getId(), template.getId(), new Date(), Upload.Status.NOT_UPLOADED, type, url, Mode.FTP_UPLOAD); _uploadDao.persist(uploadTemplateObj); if(vmTemplateHost != null) { start(); UploadCommand ucmd = new UploadCommand(template, url, vmTemplateHost.getInstallPath(), vmTemplateHost.getSize()); - UploadListener ul = new UploadListener(sserver, _timer, _uploadDao, uploadTemplateObj, this, ucmd, template.getAccountId(), template.getName(), type, eventId, asyncJobId, asyncMgr); + UploadListener ul = new UploadListener(secStore, _timer, _uploadDao, uploadTemplateObj, this, ucmd, template.getAccountId(), template.getName(), type, eventId, asyncJobId, asyncMgr); _listenerMap.put(uploadTemplateObj, ul); - - try { - send(sserver.getId(), ucmd, ul); - } catch (AgentUnavailableException e) { - s_logger.warn("Unable to start upload of " + template.getUniqueName() + " from " + sserver.getName() + " to " +url, e); + try{ + EndPoint ep = _epSelector.select(secStore); + ep.sendMessageAsyncWithListener(ucmd, ul); + } catch (Exception e) { + s_logger.warn("Unable to start upload of " + template.getUniqueName() + " from " + secStore.getName() + " to " +url, e); ul.setDisconnected(); ul.scheduleStatusCheck(RequestType.GET_OR_RESTART); } @@ -282,19 +282,18 @@ public class UploadMonitorImpl extends ManagerBase implements UploadMonitor { // Create Symlink at ssvm String uuid = UUID.randomUUID().toString() + path.substring(path.length() - 4) ; // last 4 characters of the path specify the format like .vhd - HostVO secStorage = ApiDBUtils.findHostById(ApiDBUtils.findUploadById(uploadId).getHostId()); - HostVO ssvm = _ssvmMgr.pickSsvmHost(secStorage); - if( ssvm == null ) { - errorString = "There is no secondary storage VM for secondary storage host " + secStorage.getName(); + DataStore secStore = this.storeMgr.getDataStore(ApiDBUtils.findUploadById(uploadId).getHostId(), DataStoreRole.Image); + EndPoint ep = _epSelector.select(secStore); + if( ep == null ) { + errorString = "There is no secondary storage VM for secondary storage host " + secStore.getName(); throw new CloudRuntimeException(errorString); } - CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(secStorage.getParent(), path, uuid); - try { - send(ssvm.getId(), cmd, null); - } catch (AgentUnavailableException e) { - errorString = "Unable to create a link for " +type+ " id:"+entityId + "," + e.getMessage(); - s_logger.warn(errorString, e); + CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(((ImageStoreVO)secStore).getParent(), path, uuid); + Answer ans = ep.sendMessage(cmd); + if (ans == null || !ans.getResult()) { + errorString = "Unable to create a link for " +type+ " id:"+entityId + "," + ans.getDetails(); + s_logger.warn(errorString); throw new CloudRuntimeException(errorString); } @@ -342,9 +341,6 @@ public class UploadMonitorImpl extends ManagerBase implements UploadMonitor { - public void send(Long hostId, Command cmd, Listener listener) throws AgentUnavailableException { - _agentMgr.send(hostId, new Commands(cmd), listener); - } @Override public boolean configure(String name, Map params) @@ -382,7 +378,7 @@ public class UploadMonitorImpl extends ManagerBase implements UploadMonitor { return true; } - public void handleUploadEvent(HostVO host, Long accountId, String typeName, Type type, Long uploadId, com.cloud.storage.Upload.Status reason, long eventId) { + public void handleUploadEvent(Long accountId, String typeName, Type type, Long uploadId, com.cloud.storage.Upload.Status reason, long eventId) { if ((reason == Upload.Status.UPLOADED) || (reason==Upload.Status.ABANDONED)){ UploadVO uploadObj = new UploadVO(uploadId); @@ -463,23 +459,25 @@ public class UploadMonitorImpl extends ManagerBase implements UploadMonitor { for (UploadVO extractJob : extractJobs){ if( getTimeDiff(extractJob.getLastUpdated()) > EXTRACT_URL_LIFE_LIMIT_IN_SECONDS ){ String path = extractJob.getInstallPath(); - HostVO secStorage = ApiDBUtils.findHostById(extractJob.getHostId()); + DataStore secStore = this.storeMgr.getDataStore(extractJob.getHostId(), DataStoreRole.Image); + // Would delete the symlink for the Type and if Type == VOLUME then also the volume - DeleteEntityDownloadURLCommand cmd = new DeleteEntityDownloadURLCommand(path, extractJob.getType(),extractJob.getUploadUrl(), secStorage.getParent()); - HostVO ssvm = _ssvmMgr.pickSsvmHost(secStorage); - if( ssvm == null ) { + DeleteEntityDownloadURLCommand cmd = new DeleteEntityDownloadURLCommand(path, extractJob.getType(),extractJob.getUploadUrl(), ((ImageStoreVO)secStore).getParent()); + EndPoint ep = _epSelector.select(secStore); + if( ep == null ) { s_logger.warn("UploadMonitor cleanup: There is no secondary storage VM for secondary storage host " + extractJob.getHostId()); continue; //TODO: why continue? why not break? } if (s_logger.isDebugEnabled()) { - s_logger.debug("UploadMonitor cleanup: Sending deletion of extract URL "+ extractJob.getUploadUrl() + " to ssvm " + ssvm.getId()); + s_logger.debug("UploadMonitor cleanup: Sending deletion of extract URL "+ extractJob.getUploadUrl() + " to ssvm " + ep.getHostAddr()); } - try { - send(ssvm.getId(), cmd, null); //TODO: how do you know if it was successful? + Answer ans = ep.sendMessage(cmd); + if ( ans != null && ans.getResult()){ _uploadDao.remove(extractJob.getId()); - } catch (AgentUnavailableException e) { - s_logger.warn("UploadMonitor cleanup: Unable to delete the link for " + extractJob.getType()+ " id=" + extractJob.getTypeId()+ " url="+ extractJob.getUploadUrl() + " on ssvm " + ssvm.getId(), e); + } + else{ + s_logger.warn("UploadMonitor cleanup: Unable to delete the link for " + extractJob.getType()+ " id=" + extractJob.getTypeId()+ " url="+ extractJob.getUploadUrl() + " on ssvm " + ep.getHostAddr()); } } } diff --git a/server/src/com/cloud/template/TemplateManager.java b/server/src/com/cloud/template/TemplateManager.java index dedb0b480d6..202feefcb3e 100755 --- a/server/src/com/cloud/template/TemplateManager.java +++ b/server/src/com/cloud/template/TemplateManager.java @@ -100,10 +100,6 @@ public interface TemplateManager extends TemplateApiService{ DataStore getImageStore(long zoneId, long tmpltId); - HostVO getSecondaryStorageHost(long zoneId); - - List getSecondaryStorageHosts(long zoneId); - Long getTemplateSize(long templateId, long zoneId); DataStore getImageStore(String storeUuid, Long zoneId); diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java index abe467a98af..eb628a9fab5 100755 --- a/server/src/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/com/cloud/template/TemplateManagerImpl.java @@ -1742,35 +1742,6 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager, } - @Override - public HostVO getSecondaryStorageHost(long zoneId) { - List hosts = _ssvmMgr - .listSecondaryStorageHostsInOneZone(zoneId); - if (hosts == null || hosts.size() == 0) { - hosts = _ssvmMgr.listLocalSecondaryStorageHostsInOneZone(zoneId); - if (hosts.isEmpty()) { - return null; - } - } - - int size = hosts.size(); - Random rn = new Random(); - int index = rn.nextInt(size); - return hosts.get(index); - } - - @Override - public List getSecondaryStorageHosts(long zoneId) { - List hosts = _ssvmMgr - .listSecondaryStorageHostsInOneZone(zoneId); - if (hosts == null || hosts.size() == 0) { - hosts = _ssvmMgr.listLocalSecondaryStorageHostsInOneZone(zoneId); - if (hosts.isEmpty()) { - return new ArrayList(); - } - } - return hosts; - } @Override public Long getTemplateSize(long templateId, long zoneId) {