You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by ka...@apache.org on 2017/04/13 11:21:38 UTC

[12/50] [abbrv] kylin git commit: KYLIN-2529 Allow thread-local override of KylinConfig

KYLIN-2529 Allow thread-local override of KylinConfig


Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/1e8b6a5e
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/1e8b6a5e
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/1e8b6a5e

Branch: refs/heads/KYLIN-2506
Commit: 1e8b6a5e7b1350930c68e750fb1ce75c27428082
Parents: 782a974
Author: lidongsjtu <li...@apache.org>
Authored: Thu Mar 30 19:54:34 2017 +0800
Committer: lidongsjtu <li...@apache.org>
Committed: Fri Mar 31 19:03:54 2017 +0800

----------------------------------------------------------------------
 .../org/apache/kylin/common/KylinConfig.java    | 37 ++++++++++++++------
 .../apache/kylin/common/KylinConfigTest.java    | 31 +++++++++++++++-
 2 files changed, 56 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/1e8b6a5e/core-common/src/main/java/org/apache/kylin/common/KylinConfig.java
----------------------------------------------------------------------
diff --git a/core-common/src/main/java/org/apache/kylin/common/KylinConfig.java b/core-common/src/main/java/org/apache/kylin/common/KylinConfig.java
index c6b1511..a9a0c45 100644
--- a/core-common/src/main/java/org/apache/kylin/common/KylinConfig.java
+++ b/core-common/src/main/java/org/apache/kylin/common/KylinConfig.java
@@ -50,30 +50,41 @@ public class KylinConfig extends KylinConfigBase {
     public static final String KYLIN_CONF = "KYLIN_CONF";
 
     // static cached instances
-    private static KylinConfig ENV_INSTANCE = null;
+    private static KylinConfig SYS_ENV_INSTANCE = null;
+
+    // thread-local instances, will override SYS_ENV_INSTANCE
+    private static final transient ThreadLocal<KylinConfig> THREAD_ENV_INSTANCE = new ThreadLocal<>();
 
     public static KylinConfig getInstanceFromEnv() {
         synchronized (KylinConfig.class) {
-            if (ENV_INSTANCE == null) {
+            KylinConfig config = THREAD_ENV_INSTANCE.get();
+            if (config != null) {
+                return config;
+            }
+
+            if (SYS_ENV_INSTANCE == null) {
                 try {
-                    KylinConfig config = new KylinConfig();
+                    config = new KylinConfig();
                     config.reloadKylinConfig(getKylinProperties());
 
                     logger.info("Initialized a new KylinConfig from getInstanceFromEnv : " + System.identityHashCode(config));
-                    ENV_INSTANCE = config;
+                    SYS_ENV_INSTANCE = config;
                 } catch (IllegalArgumentException e) {
                     throw new IllegalStateException("Failed to find KylinConfig ", e);
                 }
             }
-            return ENV_INSTANCE;
+            return SYS_ENV_INSTANCE;
         }
     }
 
     //Only used in test cases!!! 
     public static void destroyInstance() {
-        logger.info("Destory KylinConfig");
-        dumpStackTrace();
-        ENV_INSTANCE = null;
+        synchronized (KylinConfig.class) {
+            logger.info("Destroy KylinConfig");
+            dumpStackTrace();
+            SYS_ENV_INSTANCE = null;
+            THREAD_ENV_INSTANCE.remove();
+        }
     }
 
     public enum UriType {
@@ -158,12 +169,12 @@ public class KylinConfig extends KylinConfigBase {
 
     public static void setKylinConfigInEnvIfMissing(Properties prop) {
         synchronized (KylinConfig.class) {
-            if (ENV_INSTANCE == null) {
+            if (SYS_ENV_INSTANCE == null) {
                 try {
                     KylinConfig config = new KylinConfig();
                     config.reloadKylinConfig(prop);
-                    logger.info("Resetting ENV_INSTANCE by a input stream: " + System.identityHashCode(config));
-                    ENV_INSTANCE = config;
+                    logger.info("Resetting SYS_ENV_INSTANCE by a input stream: " + System.identityHashCode(config));
+                    SYS_ENV_INSTANCE = config;
                 } catch (IllegalArgumentException e) {
                     throw new IllegalStateException("Failed to find KylinConfig ", e);
                 }
@@ -177,6 +188,10 @@ public class KylinConfig extends KylinConfigBase {
         setKylinConfigInEnvIfMissing(props);
     }
 
+    public static void setKylinConfigThreadLocal(KylinConfig config) {
+        THREAD_ENV_INSTANCE.set(config);
+    }
+
     public static KylinConfig createKylinConfig(String propsInStr) throws IOException {
         Properties props = new Properties();
         props.load(new StringReader(propsInStr));

http://git-wip-us.apache.org/repos/asf/kylin/blob/1e8b6a5e/core-common/src/test/java/org/apache/kylin/common/KylinConfigTest.java
----------------------------------------------------------------------
diff --git a/core-common/src/test/java/org/apache/kylin/common/KylinConfigTest.java b/core-common/src/test/java/org/apache/kylin/common/KylinConfigTest.java
index 7e4b444..3976c6c 100644
--- a/core-common/src/test/java/org/apache/kylin/common/KylinConfigTest.java
+++ b/core-common/src/test/java/org/apache/kylin/common/KylinConfigTest.java
@@ -25,6 +25,7 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import java.util.Map;
+import java.util.Properties;
 
 import org.apache.kylin.common.util.HotLoadKylinPropertiesTestCase;
 import org.junit.Test;
@@ -86,7 +87,7 @@ public class KylinConfigTest extends HotLoadKylinPropertiesTestCase {
     public void testGetMetadataUrlPrefix() {
         KylinConfig config = KylinConfig.getInstanceFromEnv();
         final String default_metadata_prefix = "kylin_metadata";
-        
+
         config.setMetadataUrl("testMetaPrefix@hbase");
         assertEquals("testMetaPrefix", config.getMetadataUrlPrefix());
 
@@ -96,4 +97,32 @@ public class KylinConfigTest extends HotLoadKylinPropertiesTestCase {
         config.setMetadataUrl("/kylin/temp");
         assertEquals(default_metadata_prefix, config.getMetadataUrlPrefix());
     }
+
+    @Test
+    public void testThreadLocalOverride() {
+        final String metadata1 = "meta1";
+        final String metadata2 = "meta2";
+
+        // set system KylinConfig
+        KylinConfig sysConfig = KylinConfig.getInstanceFromEnv();
+        sysConfig.setMetadataUrl(metadata1);
+
+        assertEquals(metadata1, KylinConfig.getInstanceFromEnv().getMetadataUrl());
+
+        // test thread-local override
+        KylinConfig threadConfig = KylinConfig.createKylinConfig(new Properties());
+        threadConfig.setMetadataUrl(metadata2);
+        KylinConfig.setKylinConfigThreadLocal(threadConfig);
+
+        assertEquals(metadata2, KylinConfig.getInstanceFromEnv().getMetadataUrl());
+
+        // other threads still use system KylinConfig
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                System.out.println("Started new thread.");
+                assertEquals(metadata1, KylinConfig.getInstanceFromEnv().getMetadataUrl());
+            }
+        }).start();
+    }
 }