diff --git a/engine/storage/src/org/apache/cloudstack/storage/RemoteHostEndPoint.java b/engine/storage/src/org/apache/cloudstack/storage/RemoteHostEndPoint.java index 3bad62eb574..b438bc121e4 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/RemoteHostEndPoint.java +++ b/engine/storage/src/org/apache/cloudstack/storage/RemoteHostEndPoint.java @@ -18,17 +18,15 @@ */ package org.apache.cloudstack.storage; +import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; import javax.inject.Inject; -import org.apache.log4j.Logger; - import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.managed.context.ManagedContextRunnable; +import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.agent.Listener; @@ -54,9 +52,11 @@ import com.cloud.vm.dao.SecondaryStorageVmDao; public class RemoteHostEndPoint implements EndPoint { private static final Logger s_logger = Logger.getLogger(RemoteHostEndPoint.class); + private long hostId; private String hostAddress; private String publicAddress; + @Inject AgentManager agentMgr; @Inject @@ -65,10 +65,10 @@ public class RemoteHostEndPoint implements EndPoint { protected SecondaryStorageVmDao vmDao; @Inject protected HostDao _hostDao; - private ScheduledExecutorService executor; + + private static ExecutorService executorService = Executors.newCachedThreadPool(new NamedThreadFactory("RemoteHostEndPoint")); public RemoteHostEndPoint() { - executor = Executors.newScheduledThreadPool(10, new NamedThreadFactory("RemoteHostEndPoint")); } private void configure(Host host) { @@ -134,17 +134,17 @@ public class RemoteHostEndPoint implements EndPoint { } private class CmdRunner extends ManagedContextRunnable implements Listener { - final AsyncCompletionCallback callback; - Answer answer; + private final AsyncCompletionCallback callback; + private Answer answer; - public CmdRunner(AsyncCompletionCallback callback) { + CmdRunner(final AsyncCompletionCallback callback) { this.callback = callback; } @Override public boolean processAnswers(long agentId, long seq, Answer[] answers) { - answer = answers[0]; - executor.schedule(this, 10, TimeUnit.SECONDS); + this.answer = answers[0]; + RemoteHostEndPoint.executorService.submit(this); return true; } @@ -204,7 +204,7 @@ public class RemoteHostEndPoint implements EndPoint { @Override protected void runInContext() { - callback.complete(answer); + this.callback.complete(this.answer); } } diff --git a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java index e414b6c4c35..c25c1adaf7a 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java +++ b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java @@ -106,16 +106,19 @@ public class DefaultEndPointSelector implements EndPointSelector { StringBuilder sbuilder = new StringBuilder(); sbuilder.append(sqlBase); - if (scope.getScopeType() == ScopeType.HOST) { - sbuilder.append(" and h.id = "); - sbuilder.append(scope.getScopeId()); - } else if (scope.getScopeType() == ScopeType.CLUSTER) { - sbuilder.append(" and h.cluster_id = "); - sbuilder.append(scope.getScopeId()); - } else if (scope.getScopeType() == ScopeType.ZONE) { - sbuilder.append(" and h.data_center_id = "); - sbuilder.append(scope.getScopeId()); + if (scope != null) { + if (scope.getScopeType() == ScopeType.HOST) { + sbuilder.append(" and h.id = "); + sbuilder.append(scope.getScopeId()); + } else if (scope.getScopeType() == ScopeType.CLUSTER) { + sbuilder.append(" and h.cluster_id = "); + sbuilder.append(scope.getScopeId()); + } else if (scope.getScopeType() == ScopeType.ZONE) { + sbuilder.append(" and h.data_center_id = "); + sbuilder.append(scope.getScopeId()); + } } + // TODO: order by rand() is slow if there are lot of hosts sbuilder.append(") t where t.value<>'true' or t.value is null"); //Added for exclude cluster's subquery sbuilder.append(" ORDER by rand() limit 1");