Repository: cloudstack Updated Branches: refs/heads/4.4 33c0d6c7b -> 6b342ffce
CLOUDSTACK-6478: Failed to download Template when having 3 SSVM's in one zone on Vmware. Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/65bdf2c9 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/65bdf2c9 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/65bdf2c9 Branch: refs/heads/4.4 Commit: 65bdf2c9ca6a2d46b9504f8647ec08ffb29f0a89 Parents: 33c0d6c Author: Min Chen <min.c...@citrix.com> Authored: Tue Apr 22 19:14:55 2014 -0700 Committer: Daan Hoogland <d...@onecht.net> Committed: Fri Apr 25 21:26:27 2014 +0200 ---------------------------------------------------------------------- .../cloudstack/storage/RemoteHostEndPoint.java | 43 +++++++++++++++----- 1 file changed, 32 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/65bdf2c9/engine/storage/src/org/apache/cloudstack/storage/RemoteHostEndPoint.java ---------------------------------------------------------------------- diff --git a/engine/storage/src/org/apache/cloudstack/storage/RemoteHostEndPoint.java b/engine/storage/src/org/apache/cloudstack/storage/RemoteHostEndPoint.java index 34f9c9d..c54430f 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/RemoteHostEndPoint.java +++ b/engine/storage/src/org/apache/cloudstack/storage/RemoteHostEndPoint.java @@ -25,8 +25,7 @@ import java.util.concurrent.TimeUnit; import javax.inject.Inject; import org.apache.log4j.Logger; -import com.cloud.vm.SecondaryStorageVmVO; -import com.cloud.vm.dao.SecondaryStorageVmDao; + import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.managed.context.ManagedContextRunnable; @@ -43,11 +42,15 @@ import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.ConnectionException; import com.cloud.exception.OperationTimedoutException; import com.cloud.host.Host; +import com.cloud.host.HostVO; import com.cloud.host.Status; +import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.HypervisorGuruManager; import com.cloud.utils.component.ComponentContext; import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.vm.SecondaryStorageVmVO; +import com.cloud.vm.dao.SecondaryStorageVmDao; public class RemoteHostEndPoint implements EndPoint { private static final Logger s_logger = Logger.getLogger(RemoteHostEndPoint.class); @@ -60,6 +63,8 @@ public class RemoteHostEndPoint implements EndPoint { protected HypervisorGuruManager _hvGuruMgr; @Inject protected SecondaryStorageVmDao vmDao; + @Inject + protected HostDao _hostDao; private ScheduledExecutorService executor; public RemoteHostEndPoint() { @@ -67,14 +72,14 @@ public class RemoteHostEndPoint implements EndPoint { } private void configure(Host host) { - this.hostId = host.getId(); - this.hostAddress = host.getPrivateIpAddress(); - this.publicAddress = host.getPublicIpAddress(); + hostId = host.getId(); + hostAddress = host.getPrivateIpAddress(); + publicAddress = host.getPublicIpAddress(); if (Host.Type.SecondaryStorageVM == host.getType()) { String vmName = host.getName(); SecondaryStorageVmVO ssvm = vmDao.findByInstanceName(vmName); if (ssvm != null) { - this.publicAddress = ssvm.getPublicIpAddress(); + publicAddress = ssvm.getPublicIpAddress(); } } } @@ -87,17 +92,25 @@ public class RemoteHostEndPoint implements EndPoint { @Override public String getHostAddr() { - return this.hostAddress; + return hostAddress; } @Override public String getPublicAddr() { - return this.publicAddress; + return publicAddress; } @Override public long getId() { - return this.hostId; + return hostId; + } + + // used when HypervisorGuruManager choose a different host to send command + private void setId(long id) { + HostVO host = _hostDao.findById(hostId); + if (host != null) { + configure(host); + } } @Override @@ -105,6 +118,10 @@ public class RemoteHostEndPoint implements EndPoint { String errMsg = null; try { long newHostId = _hvGuruMgr.getGuruProcessedCommandTargetHost(hostId, cmd); + if (newHostId != hostId) { + // update endpoint with new host if changed + setId(newHostId); + } return agentMgr.send(newHostId, cmd); } catch (AgentUnavailableException e) { errMsg = e.toString(); @@ -126,7 +143,7 @@ public class RemoteHostEndPoint implements EndPoint { @Override public boolean processAnswers(long agentId, long seq, Answer[] answers) { - this.answer = answers[0]; + answer = answers[0]; executor.schedule(this, 10, TimeUnit.SECONDS); return true; } @@ -182,7 +199,11 @@ public class RemoteHostEndPoint implements EndPoint { @Override public void sendMessageAsync(Command cmd, AsyncCompletionCallback<Answer> callback) { try { - long newHostId = _hvGuruMgr.getGuruProcessedCommandTargetHost(this.hostId, cmd); + long newHostId = _hvGuruMgr.getGuruProcessedCommandTargetHost(hostId, cmd); + if (newHostId != hostId) { + // update endpoint with new host if changed + setId(newHostId); + } if (s_logger.isDebugEnabled()) { s_logger.debug("Sending command " + cmd.toString() + " to host: " + newHostId); }