Skip to content

Commit 9250d9b

Browse files
committed
Merge commit '1e8b6a5e7b1350930c68e750fb1ce75c27428082'
2 parents ee5397b + 1e8b6a5 commit 9250d9b

File tree

2 files changed

+56
-12
lines changed

2 files changed

+56
-12
lines changed

core-common/src/main/java/org/apache/kylin/common/KylinConfig.java

+26-11
Original file line numberDiff line numberDiff line change
@@ -50,30 +50,41 @@ public class KylinConfig extends KylinConfigBase {
5050
public static final String KYLIN_CONF = "KYLIN_CONF";
5151

5252
// static cached instances
53-
private static KylinConfig ENV_INSTANCE = null;
53+
private static KylinConfig SYS_ENV_INSTANCE = null;
54+
55+
// thread-local instances, will override SYS_ENV_INSTANCE
56+
private static final transient ThreadLocal<KylinConfig> THREAD_ENV_INSTANCE = new ThreadLocal<>();
5457

5558
public static KylinConfig getInstanceFromEnv() {
5659
synchronized (KylinConfig.class) {
57-
if (ENV_INSTANCE == null) {
60+
KylinConfig config = THREAD_ENV_INSTANCE.get();
61+
if (config != null) {
62+
return config;
63+
}
64+
65+
if (SYS_ENV_INSTANCE == null) {
5866
try {
59-
KylinConfig config = new KylinConfig();
67+
config = new KylinConfig();
6068
config.reloadKylinConfig(getKylinProperties());
6169

6270
logger.info("Initialized a new KylinConfig from getInstanceFromEnv : " + System.identityHashCode(config));
63-
ENV_INSTANCE = config;
71+
SYS_ENV_INSTANCE = config;
6472
} catch (IllegalArgumentException e) {
6573
throw new IllegalStateException("Failed to find KylinConfig ", e);
6674
}
6775
}
68-
return ENV_INSTANCE;
76+
return SYS_ENV_INSTANCE;
6977
}
7078
}
7179

7280
//Only used in test cases!!!
7381
public static void destroyInstance() {
74-
logger.info("Destory KylinConfig");
75-
dumpStackTrace();
76-
ENV_INSTANCE = null;
82+
synchronized (KylinConfig.class) {
83+
logger.info("Destroy KylinConfig");
84+
dumpStackTrace();
85+
SYS_ENV_INSTANCE = null;
86+
THREAD_ENV_INSTANCE.remove();
87+
}
7788
}
7889

7990
public enum UriType {
@@ -158,12 +169,12 @@ private static Properties streamToProps(InputStream is) throws IOException {
158169

159170
public static void setKylinConfigInEnvIfMissing(Properties prop) {
160171
synchronized (KylinConfig.class) {
161-
if (ENV_INSTANCE == null) {
172+
if (SYS_ENV_INSTANCE == null) {
162173
try {
163174
KylinConfig config = new KylinConfig();
164175
config.reloadKylinConfig(prop);
165-
logger.info("Resetting ENV_INSTANCE by a input stream: " + System.identityHashCode(config));
166-
ENV_INSTANCE = config;
176+
logger.info("Resetting SYS_ENV_INSTANCE by a input stream: " + System.identityHashCode(config));
177+
SYS_ENV_INSTANCE = config;
167178
} catch (IllegalArgumentException e) {
168179
throw new IllegalStateException("Failed to find KylinConfig ", e);
169180
}
@@ -177,6 +188,10 @@ public static void setKylinConfigInEnvIfMissing(String propsInStr) throws IOExce
177188
setKylinConfigInEnvIfMissing(props);
178189
}
179190

191+
public static void setKylinConfigThreadLocal(KylinConfig config) {
192+
THREAD_ENV_INSTANCE.set(config);
193+
}
194+
180195
public static KylinConfig createKylinConfig(String propsInStr) throws IOException {
181196
Properties props = new Properties();
182197
props.load(new StringReader(propsInStr));

core-common/src/test/java/org/apache/kylin/common/KylinConfigTest.java

+30-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import static org.junit.Assert.assertTrue;
2626

2727
import java.util.Map;
28+
import java.util.Properties;
2829

2930
import org.apache.kylin.common.util.HotLoadKylinPropertiesTestCase;
3031
import org.junit.Test;
@@ -86,7 +87,7 @@ public void testPropertiesHotLoad() {
8687
public void testGetMetadataUrlPrefix() {
8788
KylinConfig config = KylinConfig.getInstanceFromEnv();
8889
final String default_metadata_prefix = "kylin_metadata";
89-
90+
9091
config.setMetadataUrl("testMetaPrefix@hbase");
9192
assertEquals("testMetaPrefix", config.getMetadataUrlPrefix());
9293

@@ -96,4 +97,32 @@ public void testGetMetadataUrlPrefix() {
9697
config.setMetadataUrl("/kylin/temp");
9798
assertEquals(default_metadata_prefix, config.getMetadataUrlPrefix());
9899
}
100+
101+
@Test
102+
public void testThreadLocalOverride() {
103+
final String metadata1 = "meta1";
104+
final String metadata2 = "meta2";
105+
106+
// set system KylinConfig
107+
KylinConfig sysConfig = KylinConfig.getInstanceFromEnv();
108+
sysConfig.setMetadataUrl(metadata1);
109+
110+
assertEquals(metadata1, KylinConfig.getInstanceFromEnv().getMetadataUrl());
111+
112+
// test thread-local override
113+
KylinConfig threadConfig = KylinConfig.createKylinConfig(new Properties());
114+
threadConfig.setMetadataUrl(metadata2);
115+
KylinConfig.setKylinConfigThreadLocal(threadConfig);
116+
117+
assertEquals(metadata2, KylinConfig.getInstanceFromEnv().getMetadataUrl());
118+
119+
// other threads still use system KylinConfig
120+
new Thread(new Runnable() {
121+
@Override
122+
public void run() {
123+
System.out.println("Started new thread.");
124+
assertEquals(metadata1, KylinConfig.getInstanceFromEnv().getMetadataUrl());
125+
}
126+
}).start();
127+
}
99128
}

0 commit comments

Comments
 (0)