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>.

Reply via email to