This is an automated email from the ASF dual-hosted git repository. bhaisaab pushed a commit to branch debian9-systemvmtemplate in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit b32eac32ae9c981a54534fa8583e350573f8c2b7 Author: Rohit Yadav <rohit.ya...@shapeblue.com> AuthorDate: Mon Nov 20 17:33:20 2017 +0530 speed up console proxy service loading Signed-off-by: Rohit Yadav <rohit.ya...@shapeblue.com> --- .../resource/consoleproxy/ConsoleProxyResource.java | 16 ++++++++-------- .../src/com/cloud/consoleproxy/ConsoleProxy.java | 17 ++++++++++------- .../src/main/java/com/cloud/utils/ReflectUtil.java | 21 +++++++++++++++++++++ 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/agent/src/com/cloud/agent/resource/consoleproxy/ConsoleProxyResource.java b/agent/src/com/cloud/agent/resource/consoleproxy/ConsoleProxyResource.java index 1fed3be..6e4f8af 100644 --- a/agent/src/com/cloud/agent/resource/consoleproxy/ConsoleProxyResource.java +++ b/agent/src/com/cloud/agent/resource/consoleproxy/ConsoleProxyResource.java @@ -59,6 +59,7 @@ import com.cloud.host.Host.Type; import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResourceBase; import com.cloud.utils.NumbersUtil; +import com.cloud.utils.ReflectUtil; import com.cloud.utils.net.NetUtils; import com.cloud.utils.script.Script; import com.google.gson.Gson; @@ -315,20 +316,19 @@ public class ConsoleProxyResource extends ServerResourceBase implements ServerRe private void launchConsoleProxy(final byte[] ksBits, final String ksPassword, final String encryptorPassword) { final Object resource = this; + s_logger.info("Building class loader for com.cloud.consoleproxy.ConsoleProxy"); + final ClassLoader loader = ReflectUtil.getClassLoaderForJar("console-proxy"); if (_consoleProxyMain == null) { + s_logger.info("Running com.cloud.consoleproxy.ConsoleProxy"); _consoleProxyMain = new Thread(new ManagedContextRunnable() { @Override protected void runInContext() { try { - Class<?> consoleProxyClazz = Class.forName("com.cloud.consoleproxy.ConsoleProxy"); + Class<?> consoleProxyClazz = loader.loadClass("com.cloud.consoleproxy.ConsoleProxy"); try { - s_logger.info("Invoke setEncryptorPassword(), ecnryptorPassword: " + encryptorPassword); - Method methodSetup = consoleProxyClazz.getMethod("setEncryptorPassword", String.class); - methodSetup.invoke(null, encryptorPassword); - s_logger.info("Invoke startWithContext()"); - Method method = consoleProxyClazz.getMethod("startWithContext", Properties.class, Object.class, byte[].class, String.class); - method.invoke(null, _properties, resource, ksBits, ksPassword); + Method method = consoleProxyClazz.getMethod("startWithContext", Properties.class, Object.class, byte[].class, String.class, String.class); + method.invoke(null, _properties, resource, ksBits, ksPassword, encryptorPassword); } catch (SecurityException e) { s_logger.error("Unable to launch console proxy due to SecurityException", e); System.exit(ExitStatus.Error.value()); @@ -357,7 +357,7 @@ public class ConsoleProxyResource extends ServerResourceBase implements ServerRe s_logger.info("com.cloud.consoleproxy.ConsoleProxy is already running"); try { - Class<?> consoleProxyClazz = Class.forName("com.cloud.consoleproxy.ConsoleProxy"); + Class<?> consoleProxyClazz = loader.loadClass("com.cloud.consoleproxy.ConsoleProxy"); Method methodSetup = consoleProxyClazz.getMethod("setEncryptorPassword", String.class); methodSetup.invoke(null, encryptorPassword); } catch (SecurityException e) { diff --git a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxy.java b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxy.java index 863f0bf..44d6a26 100644 --- a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxy.java +++ b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxy.java @@ -36,11 +36,11 @@ import java.util.concurrent.Executor; import org.apache.commons.codec.binary.Base64; import org.apache.log4j.xml.DOMConfigurator; -import com.google.gson.Gson; -import com.sun.net.httpserver.HttpServer; - import com.cloud.consoleproxy.util.Logger; import com.cloud.utils.PropertiesUtil; +import com.cloud.utils.ReflectUtil; +import com.google.gson.Gson; +import com.sun.net.httpserver.HttpServer; /** * @@ -249,23 +249,26 @@ public class ConsoleProxy { } } - public static void startWithContext(Properties conf, Object context, byte[] ksBits, String ksPassword) { + public static void startWithContext(Properties conf, Object context, byte[] ksBits, String ksPassword, String password) { + configLog4j(); + Logger.setFactory(new ConsoleProxyLoggerFactory()); s_logger.info("Start console proxy with context"); + if (conf != null) { for (Object key : conf.keySet()) { s_logger.info("Context property " + (String)key + ": " + conf.getProperty((String)key)); } } - configLog4j(); - Logger.setFactory(new ConsoleProxyLoggerFactory()); + encryptorPassword = password; // Using reflection to setup private/secure communication channel towards management server ConsoleProxy.context = context; ConsoleProxy.ksBits = ksBits; ConsoleProxy.ksPassword = ksPassword; try { - Class<?> contextClazz = Class.forName("com.cloud.agent.resource.consoleproxy.ConsoleProxyResource"); + final ClassLoader loader = ReflectUtil.getClassLoaderForJar("agent"); + Class<?> contextClazz = loader.loadClass("com.cloud.agent.resource.consoleproxy.ConsoleProxyResource"); authMethod = contextClazz.getDeclaredMethod("authenticateConsoleAccess", String.class, String.class, String.class, String.class, String.class, Boolean.class); reportMethod = contextClazz.getDeclaredMethod("reportLoadInfo", String.class); ensureRouteMethod = contextClazz.getDeclaredMethod("ensureRoute", String.class); diff --git a/utils/src/main/java/com/cloud/utils/ReflectUtil.java b/utils/src/main/java/com/cloud/utils/ReflectUtil.java index c8ae954..e166845 100644 --- a/utils/src/main/java/com/cloud/utils/ReflectUtil.java +++ b/utils/src/main/java/com/cloud/utils/ReflectUtil.java @@ -29,6 +29,8 @@ import java.beans.PropertyDescriptor; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; +import java.net.URL; +import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -210,4 +212,23 @@ public class ReflectUtil { } } + /** + * Finds and returns class loader based on the provided module/jar name + * @param name + * @return returns ClassLoader + */ + public static ClassLoader getClassLoaderForJar(final String name) { + final URL[] urls = ((URLClassLoader) (Thread.currentThread().getContextClassLoader())).getURLs(); + final List<URL> searchUrls = new ArrayList<>(); + for (final URL url: urls) { + if (url.toString().contains(name)) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Search URL: " + url.toString()); + } + searchUrls.add(url); + } + } + return new URLClassLoader(searchUrls.toArray(new URL[searchUrls.size()])); + } + } -- To stop receiving notification emails like this one, please contact "commits@cloudstack.apache.org" <commits@cloudstack.apache.org>.