You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by mb...@apache.org on 2015/10/06 01:23:58 UTC
[1/6] hbase git commit: HBASE-14347 Add a switch to
DynamicClassLoader to disable it (huaxiang sun)
Repository: hbase
Updated Branches:
refs/heads/0.98 f318f6f8f -> fdaecc89f
refs/heads/branch-1 ef8cc7a57 -> 12e8076fb
refs/heads/branch-1.0 5277104e0 -> 4527c6a7c
refs/heads/branch-1.1 91bb04091 -> fbfd90225
refs/heads/branch-1.2 e41f6c934 -> c8a10f620
refs/heads/master ceafa09d3 -> 715e8b0de
HBASE-14347 Add a switch to DynamicClassLoader to disable it (huaxiang sun)
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/715e8b0d
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/715e8b0d
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/715e8b0d
Branch: refs/heads/master
Commit: 715e8b0de1a13af9fbfef997fb353cb3e97bded0
Parents: ceafa09
Author: Matteo Bertozzi <ma...@cloudera.com>
Authored: Mon Oct 5 16:17:07 2015 -0700
Committer: Matteo Bertozzi <ma...@cloudera.com>
Committed: Mon Oct 5 16:17:07 2015 -0700
----------------------------------------------------------------------
.../hadoop/hbase/util/DynamicClassLoader.java | 27 +++++++++++++++--
.../hbase/util/TestDynamicClassLoader.java | 31 ++++++++++++++++++--
2 files changed, 54 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/715e8b0d/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
index 81e4483..2d5eb5d 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
@@ -66,6 +66,11 @@ public class DynamicClassLoader extends ClassLoaderBase {
private static final String DYNAMIC_JARS_DIR_KEY = "hbase.dynamic.jars.dir";
+ private static final String DYNAMIC_JARS_OPTIONAL_CONF_KEY = "hbase.use.dynamic.jars";
+ private static final boolean DYNAMIC_JARS_OPTIONAL_DEFAULT = true;
+
+ private boolean useDynamicJars;
+
private File localDir;
// FileSystem of the remote path, set only if remoteDir != null
@@ -86,6 +91,15 @@ public class DynamicClassLoader extends ClassLoaderBase {
final Configuration conf, final ClassLoader parent) {
super(parent);
+ useDynamicJars = conf.getBoolean(
+ DYNAMIC_JARS_OPTIONAL_CONF_KEY, DYNAMIC_JARS_OPTIONAL_DEFAULT);
+
+ if (useDynamicJars) {
+ initTempDir(conf);
+ }
+ }
+
+ private void initTempDir(final Configuration conf) {
jarModifiedTime = new HashMap<String, Long>();
String localDirPath = conf.get(
LOCAL_DIR_KEY, DEFAULT_LOCAL_DIR) + DYNAMIC_JARS_DIR;
@@ -120,7 +134,17 @@ public class DynamicClassLoader extends ClassLoaderBase {
LOG.debug("Class " + name + " not found - using dynamical class loader");
}
- synchronized (getClassLoadingLock(name)) {
+ if (useDynamicJars) {
+ return tryRefreshClass(name);
+ }
+ throw e;
+ }
+ }
+
+
+ private Class<?> tryRefreshClass(String name)
+ throws ClassNotFoundException {
+ synchronized (getClassLoadingLock(name)) {
// Check whether the class has already been loaded:
Class<?> clasz = findLoadedClass(name);
if (clasz != null) {
@@ -149,7 +173,6 @@ public class DynamicClassLoader extends ClassLoaderBase {
}
return clasz;
}
- }
}
private synchronized void loadNewJars() {
http://git-wip-us.apache.org/repos/asf/hbase/blob/715e8b0d/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java b/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
index 9269f2f..57514e3 100644
--- a/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
+++ b/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
@@ -30,6 +30,7 @@ import org.apache.hadoop.hbase.HBaseCommonTestingUtility;
import org.apache.hadoop.hbase.testclassification.MiscTests;
import org.apache.hadoop.hbase.testclassification.SmallTests;
import org.junit.Test;
+import org.junit.Before;
import org.junit.experimental.categories.Category;
/**
@@ -40,10 +41,16 @@ public class TestDynamicClassLoader {
private static final Log LOG = LogFactory.getLog(TestDynamicClassLoader.class);
private static final HBaseCommonTestingUtility TEST_UTIL = new HBaseCommonTestingUtility();
- private static final Configuration conf = TEST_UTIL.getConfiguration();
+ private Configuration conf;
static {
- conf.set("hbase.dynamic.jars.dir", TEST_UTIL.getDataTestDir().toString());
+ TEST_UTIL.getConfiguration().set(
+ "hbase.dynamic.jars.dir", TEST_UTIL.getDataTestDir().toString());
+ }
+
+ @Before
+ public void initializeConfiguration() {
+ conf = new Configuration(TEST_UTIL.getConfiguration());
}
@Test
@@ -95,6 +102,26 @@ public class TestDynamicClassLoader {
}
}
+ @Test
+ public void testLoadClassFromLocalPathWithDynamicDirOff() throws Exception {
+ conf.setBoolean("hbase.use.dynamic.jars", false);
+ ClassLoader parent = TestDynamicClassLoader.class.getClassLoader();
+ DynamicClassLoader classLoader = new DynamicClassLoader(conf, parent);
+
+ String className = "TestLoadClassFromLocalPath";
+ deleteClass(className);
+
+ try {
+ String folder = TEST_UTIL.getDataTestDir().toString();
+ ClassLoaderTestHelper.buildJar(
+ folder, className, null, ClassLoaderTestHelper.localDirPath(conf));
+ classLoader.loadClass(className);
+ fail("Should not be able to load class " + className);
+ } catch (ClassNotFoundException cnfe) {
+ // expected, move on
+ }
+ }
+
private void deleteClass(String className) throws Exception {
String jarFileName = className + ".jar";
File file = new File(TEST_UTIL.getDataTestDir().toString(), jarFileName);
[3/6] hbase git commit: HBASE-14347 Add a switch to
DynamicClassLoader to disable it (huaxiang sun)
Posted by mb...@apache.org.
HBASE-14347 Add a switch to DynamicClassLoader to disable it (huaxiang sun)
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/c8a10f62
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/c8a10f62
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/c8a10f62
Branch: refs/heads/branch-1.2
Commit: c8a10f6207da9e10edf04787a95c7181cbd5663e
Parents: e41f6c9
Author: Matteo Bertozzi <ma...@cloudera.com>
Authored: Mon Oct 5 16:17:07 2015 -0700
Committer: Matteo Bertozzi <ma...@cloudera.com>
Committed: Mon Oct 5 16:19:37 2015 -0700
----------------------------------------------------------------------
.../hadoop/hbase/util/DynamicClassLoader.java | 27 +++++++++++++++--
.../hbase/util/TestDynamicClassLoader.java | 31 ++++++++++++++++++--
2 files changed, 54 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/c8a10f62/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
index e434558..c1194ca 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
@@ -66,6 +66,11 @@ public class DynamicClassLoader extends ClassLoaderBase {
private static final String DYNAMIC_JARS_DIR_KEY = "hbase.dynamic.jars.dir";
+ private static final String DYNAMIC_JARS_OPTIONAL_CONF_KEY = "hbase.use.dynamic.jars";
+ private static final boolean DYNAMIC_JARS_OPTIONAL_DEFAULT = true;
+
+ private boolean useDynamicJars;
+
private File localDir;
// FileSystem of the remote path, set only if remoteDir != null
@@ -86,6 +91,15 @@ public class DynamicClassLoader extends ClassLoaderBase {
final Configuration conf, final ClassLoader parent) {
super(parent);
+ useDynamicJars = conf.getBoolean(
+ DYNAMIC_JARS_OPTIONAL_CONF_KEY, DYNAMIC_JARS_OPTIONAL_DEFAULT);
+
+ if (useDynamicJars) {
+ initTempDir(conf);
+ }
+ }
+
+ private void initTempDir(final Configuration conf) {
jarModifiedTime = new HashMap<String, Long>();
String localDirPath = conf.get(
LOCAL_DIR_KEY, DEFAULT_LOCAL_DIR) + DYNAMIC_JARS_DIR;
@@ -120,7 +134,17 @@ public class DynamicClassLoader extends ClassLoaderBase {
LOG.debug("Class " + name + " not found - using dynamical class loader");
}
- synchronized (getClassLoadingLock(name)) {
+ if (useDynamicJars) {
+ return tryRefreshClass(name);
+ }
+ throw e;
+ }
+ }
+
+
+ private Class<?> tryRefreshClass(String name)
+ throws ClassNotFoundException {
+ synchronized (getClassLoadingLock(name)) {
// Check whether the class has already been loaded:
Class<?> clasz = findLoadedClass(name);
if (clasz != null) {
@@ -149,7 +173,6 @@ public class DynamicClassLoader extends ClassLoaderBase {
}
return clasz;
}
- }
}
private synchronized void loadNewJars() {
http://git-wip-us.apache.org/repos/asf/hbase/blob/c8a10f62/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java b/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
index 2f26f4b..612f3f8 100644
--- a/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
+++ b/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
@@ -29,6 +29,7 @@ import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseCommonTestingUtility;
import org.apache.hadoop.hbase.testclassification.SmallTests;
import org.junit.Test;
+import org.junit.Before;
import org.junit.experimental.categories.Category;
/**
@@ -39,10 +40,16 @@ public class TestDynamicClassLoader {
private static final Log LOG = LogFactory.getLog(TestDynamicClassLoader.class);
private static final HBaseCommonTestingUtility TEST_UTIL = new HBaseCommonTestingUtility();
- private static final Configuration conf = TEST_UTIL.getConfiguration();
+ private Configuration conf;
static {
- conf.set("hbase.dynamic.jars.dir", TEST_UTIL.getDataTestDir().toString());
+ TEST_UTIL.getConfiguration().set(
+ "hbase.dynamic.jars.dir", TEST_UTIL.getDataTestDir().toString());
+ }
+
+ @Before
+ public void initializeConfiguration() {
+ conf = new Configuration(TEST_UTIL.getConfiguration());
}
@Test
@@ -94,6 +101,26 @@ public class TestDynamicClassLoader {
}
}
+ @Test
+ public void testLoadClassFromLocalPathWithDynamicDirOff() throws Exception {
+ conf.setBoolean("hbase.use.dynamic.jars", false);
+ ClassLoader parent = TestDynamicClassLoader.class.getClassLoader();
+ DynamicClassLoader classLoader = new DynamicClassLoader(conf, parent);
+
+ String className = "TestLoadClassFromLocalPath";
+ deleteClass(className);
+
+ try {
+ String folder = TEST_UTIL.getDataTestDir().toString();
+ ClassLoaderTestHelper.buildJar(
+ folder, className, null, ClassLoaderTestHelper.localDirPath(conf));
+ classLoader.loadClass(className);
+ fail("Should not be able to load class " + className);
+ } catch (ClassNotFoundException cnfe) {
+ // expected, move on
+ }
+ }
+
private void deleteClass(String className) throws Exception {
String jarFileName = className + ".jar";
File file = new File(TEST_UTIL.getDataTestDir().toString(), jarFileName);
[5/6] hbase git commit: HBASE-14347 Add a switch to
DynamicClassLoader to disable it (huaxiang sun)
Posted by mb...@apache.org.
HBASE-14347 Add a switch to DynamicClassLoader to disable it (huaxiang sun)
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/4527c6a7
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/4527c6a7
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/4527c6a7
Branch: refs/heads/branch-1.0
Commit: 4527c6a7cc00498f699e0a010ffe90bbc2d51c77
Parents: 5277104
Author: Matteo Bertozzi <ma...@cloudera.com>
Authored: Mon Oct 5 16:17:07 2015 -0700
Committer: Matteo Bertozzi <ma...@cloudera.com>
Committed: Mon Oct 5 16:21:32 2015 -0700
----------------------------------------------------------------------
.../hadoop/hbase/util/DynamicClassLoader.java | 27 +++++++++++++++--
.../hbase/util/TestDynamicClassLoader.java | 31 ++++++++++++++++++--
2 files changed, 54 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/4527c6a7/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
index e434558..c1194ca 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
@@ -66,6 +66,11 @@ public class DynamicClassLoader extends ClassLoaderBase {
private static final String DYNAMIC_JARS_DIR_KEY = "hbase.dynamic.jars.dir";
+ private static final String DYNAMIC_JARS_OPTIONAL_CONF_KEY = "hbase.use.dynamic.jars";
+ private static final boolean DYNAMIC_JARS_OPTIONAL_DEFAULT = true;
+
+ private boolean useDynamicJars;
+
private File localDir;
// FileSystem of the remote path, set only if remoteDir != null
@@ -86,6 +91,15 @@ public class DynamicClassLoader extends ClassLoaderBase {
final Configuration conf, final ClassLoader parent) {
super(parent);
+ useDynamicJars = conf.getBoolean(
+ DYNAMIC_JARS_OPTIONAL_CONF_KEY, DYNAMIC_JARS_OPTIONAL_DEFAULT);
+
+ if (useDynamicJars) {
+ initTempDir(conf);
+ }
+ }
+
+ private void initTempDir(final Configuration conf) {
jarModifiedTime = new HashMap<String, Long>();
String localDirPath = conf.get(
LOCAL_DIR_KEY, DEFAULT_LOCAL_DIR) + DYNAMIC_JARS_DIR;
@@ -120,7 +134,17 @@ public class DynamicClassLoader extends ClassLoaderBase {
LOG.debug("Class " + name + " not found - using dynamical class loader");
}
- synchronized (getClassLoadingLock(name)) {
+ if (useDynamicJars) {
+ return tryRefreshClass(name);
+ }
+ throw e;
+ }
+ }
+
+
+ private Class<?> tryRefreshClass(String name)
+ throws ClassNotFoundException {
+ synchronized (getClassLoadingLock(name)) {
// Check whether the class has already been loaded:
Class<?> clasz = findLoadedClass(name);
if (clasz != null) {
@@ -149,7 +173,6 @@ public class DynamicClassLoader extends ClassLoaderBase {
}
return clasz;
}
- }
}
private synchronized void loadNewJars() {
http://git-wip-us.apache.org/repos/asf/hbase/blob/4527c6a7/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java b/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
index 2f26f4b..612f3f8 100644
--- a/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
+++ b/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
@@ -29,6 +29,7 @@ import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseCommonTestingUtility;
import org.apache.hadoop.hbase.testclassification.SmallTests;
import org.junit.Test;
+import org.junit.Before;
import org.junit.experimental.categories.Category;
/**
@@ -39,10 +40,16 @@ public class TestDynamicClassLoader {
private static final Log LOG = LogFactory.getLog(TestDynamicClassLoader.class);
private static final HBaseCommonTestingUtility TEST_UTIL = new HBaseCommonTestingUtility();
- private static final Configuration conf = TEST_UTIL.getConfiguration();
+ private Configuration conf;
static {
- conf.set("hbase.dynamic.jars.dir", TEST_UTIL.getDataTestDir().toString());
+ TEST_UTIL.getConfiguration().set(
+ "hbase.dynamic.jars.dir", TEST_UTIL.getDataTestDir().toString());
+ }
+
+ @Before
+ public void initializeConfiguration() {
+ conf = new Configuration(TEST_UTIL.getConfiguration());
}
@Test
@@ -94,6 +101,26 @@ public class TestDynamicClassLoader {
}
}
+ @Test
+ public void testLoadClassFromLocalPathWithDynamicDirOff() throws Exception {
+ conf.setBoolean("hbase.use.dynamic.jars", false);
+ ClassLoader parent = TestDynamicClassLoader.class.getClassLoader();
+ DynamicClassLoader classLoader = new DynamicClassLoader(conf, parent);
+
+ String className = "TestLoadClassFromLocalPath";
+ deleteClass(className);
+
+ try {
+ String folder = TEST_UTIL.getDataTestDir().toString();
+ ClassLoaderTestHelper.buildJar(
+ folder, className, null, ClassLoaderTestHelper.localDirPath(conf));
+ classLoader.loadClass(className);
+ fail("Should not be able to load class " + className);
+ } catch (ClassNotFoundException cnfe) {
+ // expected, move on
+ }
+ }
+
private void deleteClass(String className) throws Exception {
String jarFileName = className + ".jar";
File file = new File(TEST_UTIL.getDataTestDir().toString(), jarFileName);
[6/6] hbase git commit: HBASE-14347 Add a switch to
DynamicClassLoader to disable it (huaxiang sun)
Posted by mb...@apache.org.
HBASE-14347 Add a switch to DynamicClassLoader to disable it (huaxiang sun)
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/fdaecc89
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/fdaecc89
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/fdaecc89
Branch: refs/heads/0.98
Commit: fdaecc89f9932f73609ce81e740a6a0e8c839979
Parents: f318f6f
Author: Matteo Bertozzi <ma...@cloudera.com>
Authored: Mon Oct 5 16:17:07 2015 -0700
Committer: Matteo Bertozzi <ma...@cloudera.com>
Committed: Mon Oct 5 16:22:22 2015 -0700
----------------------------------------------------------------------
.../hadoop/hbase/util/DynamicClassLoader.java | 27 +++++++++++++++--
.../hbase/util/TestDynamicClassLoader.java | 31 ++++++++++++++++++--
2 files changed, 54 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/fdaecc89/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
index 3f61d97..20a19aa 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
@@ -66,6 +66,11 @@ public class DynamicClassLoader extends ClassLoaderBase {
private static final String DYNAMIC_JARS_DIR_KEY = "hbase.dynamic.jars.dir";
+ private static final String DYNAMIC_JARS_OPTIONAL_CONF_KEY = "hbase.use.dynamic.jars";
+ private static final boolean DYNAMIC_JARS_OPTIONAL_DEFAULT = true;
+
+ private boolean useDynamicJars;
+
private File localDir;
// FileSystem of the remote path, set only if remoteDir != null
@@ -86,6 +91,15 @@ public class DynamicClassLoader extends ClassLoaderBase {
final Configuration conf, final ClassLoader parent) {
super(parent);
+ useDynamicJars = conf.getBoolean(
+ DYNAMIC_JARS_OPTIONAL_CONF_KEY, DYNAMIC_JARS_OPTIONAL_DEFAULT);
+
+ if (useDynamicJars) {
+ initTempDir(conf);
+ }
+ }
+
+ private void initTempDir(final Configuration conf) {
jarModifiedTime = new HashMap<String, Long>();
String localDirPath = conf.get(
LOCAL_DIR_KEY, DEFAULT_LOCAL_DIR) + DYNAMIC_JARS_DIR;
@@ -120,7 +134,17 @@ public class DynamicClassLoader extends ClassLoaderBase {
LOG.debug("Class " + name + " not found - using dynamical class loader");
}
- synchronized (getClassLoadingLock(name)) {
+ if (useDynamicJars) {
+ return tryRefreshClass(name);
+ }
+ throw e;
+ }
+ }
+
+
+ private Class<?> tryRefreshClass(String name)
+ throws ClassNotFoundException {
+ synchronized (getClassLoadingLock(name)) {
// Check whether the class has already been loaded:
Class<?> clasz = findLoadedClass(name);
if (clasz != null) {
@@ -149,7 +173,6 @@ public class DynamicClassLoader extends ClassLoaderBase {
}
return clasz;
}
- }
}
private synchronized void loadNewJars() {
http://git-wip-us.apache.org/repos/asf/hbase/blob/fdaecc89/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java b/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
index 2f26f4b..612f3f8 100644
--- a/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
+++ b/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
@@ -29,6 +29,7 @@ import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseCommonTestingUtility;
import org.apache.hadoop.hbase.testclassification.SmallTests;
import org.junit.Test;
+import org.junit.Before;
import org.junit.experimental.categories.Category;
/**
@@ -39,10 +40,16 @@ public class TestDynamicClassLoader {
private static final Log LOG = LogFactory.getLog(TestDynamicClassLoader.class);
private static final HBaseCommonTestingUtility TEST_UTIL = new HBaseCommonTestingUtility();
- private static final Configuration conf = TEST_UTIL.getConfiguration();
+ private Configuration conf;
static {
- conf.set("hbase.dynamic.jars.dir", TEST_UTIL.getDataTestDir().toString());
+ TEST_UTIL.getConfiguration().set(
+ "hbase.dynamic.jars.dir", TEST_UTIL.getDataTestDir().toString());
+ }
+
+ @Before
+ public void initializeConfiguration() {
+ conf = new Configuration(TEST_UTIL.getConfiguration());
}
@Test
@@ -94,6 +101,26 @@ public class TestDynamicClassLoader {
}
}
+ @Test
+ public void testLoadClassFromLocalPathWithDynamicDirOff() throws Exception {
+ conf.setBoolean("hbase.use.dynamic.jars", false);
+ ClassLoader parent = TestDynamicClassLoader.class.getClassLoader();
+ DynamicClassLoader classLoader = new DynamicClassLoader(conf, parent);
+
+ String className = "TestLoadClassFromLocalPath";
+ deleteClass(className);
+
+ try {
+ String folder = TEST_UTIL.getDataTestDir().toString();
+ ClassLoaderTestHelper.buildJar(
+ folder, className, null, ClassLoaderTestHelper.localDirPath(conf));
+ classLoader.loadClass(className);
+ fail("Should not be able to load class " + className);
+ } catch (ClassNotFoundException cnfe) {
+ // expected, move on
+ }
+ }
+
private void deleteClass(String className) throws Exception {
String jarFileName = className + ".jar";
File file = new File(TEST_UTIL.getDataTestDir().toString(), jarFileName);
[4/6] hbase git commit: HBASE-14347 Add a switch to
DynamicClassLoader to disable it (huaxiang sun)
Posted by mb...@apache.org.
HBASE-14347 Add a switch to DynamicClassLoader to disable it (huaxiang sun)
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/fbfd9022
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/fbfd9022
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/fbfd9022
Branch: refs/heads/branch-1.1
Commit: fbfd90225bcede0d254ecb5c7023bac141ace45a
Parents: 91bb040
Author: Matteo Bertozzi <ma...@cloudera.com>
Authored: Mon Oct 5 16:17:07 2015 -0700
Committer: Matteo Bertozzi <ma...@cloudera.com>
Committed: Mon Oct 5 16:20:32 2015 -0700
----------------------------------------------------------------------
.../hadoop/hbase/util/DynamicClassLoader.java | 27 +++++++++++++++--
.../hbase/util/TestDynamicClassLoader.java | 31 ++++++++++++++++++--
2 files changed, 54 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/fbfd9022/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
index e434558..c1194ca 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
@@ -66,6 +66,11 @@ public class DynamicClassLoader extends ClassLoaderBase {
private static final String DYNAMIC_JARS_DIR_KEY = "hbase.dynamic.jars.dir";
+ private static final String DYNAMIC_JARS_OPTIONAL_CONF_KEY = "hbase.use.dynamic.jars";
+ private static final boolean DYNAMIC_JARS_OPTIONAL_DEFAULT = true;
+
+ private boolean useDynamicJars;
+
private File localDir;
// FileSystem of the remote path, set only if remoteDir != null
@@ -86,6 +91,15 @@ public class DynamicClassLoader extends ClassLoaderBase {
final Configuration conf, final ClassLoader parent) {
super(parent);
+ useDynamicJars = conf.getBoolean(
+ DYNAMIC_JARS_OPTIONAL_CONF_KEY, DYNAMIC_JARS_OPTIONAL_DEFAULT);
+
+ if (useDynamicJars) {
+ initTempDir(conf);
+ }
+ }
+
+ private void initTempDir(final Configuration conf) {
jarModifiedTime = new HashMap<String, Long>();
String localDirPath = conf.get(
LOCAL_DIR_KEY, DEFAULT_LOCAL_DIR) + DYNAMIC_JARS_DIR;
@@ -120,7 +134,17 @@ public class DynamicClassLoader extends ClassLoaderBase {
LOG.debug("Class " + name + " not found - using dynamical class loader");
}
- synchronized (getClassLoadingLock(name)) {
+ if (useDynamicJars) {
+ return tryRefreshClass(name);
+ }
+ throw e;
+ }
+ }
+
+
+ private Class<?> tryRefreshClass(String name)
+ throws ClassNotFoundException {
+ synchronized (getClassLoadingLock(name)) {
// Check whether the class has already been loaded:
Class<?> clasz = findLoadedClass(name);
if (clasz != null) {
@@ -149,7 +173,6 @@ public class DynamicClassLoader extends ClassLoaderBase {
}
return clasz;
}
- }
}
private synchronized void loadNewJars() {
http://git-wip-us.apache.org/repos/asf/hbase/blob/fbfd9022/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java b/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
index 2f26f4b..612f3f8 100644
--- a/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
+++ b/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
@@ -29,6 +29,7 @@ import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseCommonTestingUtility;
import org.apache.hadoop.hbase.testclassification.SmallTests;
import org.junit.Test;
+import org.junit.Before;
import org.junit.experimental.categories.Category;
/**
@@ -39,10 +40,16 @@ public class TestDynamicClassLoader {
private static final Log LOG = LogFactory.getLog(TestDynamicClassLoader.class);
private static final HBaseCommonTestingUtility TEST_UTIL = new HBaseCommonTestingUtility();
- private static final Configuration conf = TEST_UTIL.getConfiguration();
+ private Configuration conf;
static {
- conf.set("hbase.dynamic.jars.dir", TEST_UTIL.getDataTestDir().toString());
+ TEST_UTIL.getConfiguration().set(
+ "hbase.dynamic.jars.dir", TEST_UTIL.getDataTestDir().toString());
+ }
+
+ @Before
+ public void initializeConfiguration() {
+ conf = new Configuration(TEST_UTIL.getConfiguration());
}
@Test
@@ -94,6 +101,26 @@ public class TestDynamicClassLoader {
}
}
+ @Test
+ public void testLoadClassFromLocalPathWithDynamicDirOff() throws Exception {
+ conf.setBoolean("hbase.use.dynamic.jars", false);
+ ClassLoader parent = TestDynamicClassLoader.class.getClassLoader();
+ DynamicClassLoader classLoader = new DynamicClassLoader(conf, parent);
+
+ String className = "TestLoadClassFromLocalPath";
+ deleteClass(className);
+
+ try {
+ String folder = TEST_UTIL.getDataTestDir().toString();
+ ClassLoaderTestHelper.buildJar(
+ folder, className, null, ClassLoaderTestHelper.localDirPath(conf));
+ classLoader.loadClass(className);
+ fail("Should not be able to load class " + className);
+ } catch (ClassNotFoundException cnfe) {
+ // expected, move on
+ }
+ }
+
private void deleteClass(String className) throws Exception {
String jarFileName = className + ".jar";
File file = new File(TEST_UTIL.getDataTestDir().toString(), jarFileName);
[2/6] hbase git commit: HBASE-14347 Add a switch to
DynamicClassLoader to disable it (huaxiang sun)
Posted by mb...@apache.org.
HBASE-14347 Add a switch to DynamicClassLoader to disable it (huaxiang sun)
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/12e8076f
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/12e8076f
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/12e8076f
Branch: refs/heads/branch-1
Commit: 12e8076fbadd8ae062d7f5a11e69b2d9a27d5af2
Parents: ef8cc7a
Author: Matteo Bertozzi <ma...@cloudera.com>
Authored: Mon Oct 5 16:17:07 2015 -0700
Committer: Matteo Bertozzi <ma...@cloudera.com>
Committed: Mon Oct 5 16:17:30 2015 -0700
----------------------------------------------------------------------
.../hadoop/hbase/util/DynamicClassLoader.java | 27 +++++++++++++++--
.../hbase/util/TestDynamicClassLoader.java | 31 ++++++++++++++++++--
2 files changed, 54 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/12e8076f/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
index e434558..c1194ca 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DynamicClassLoader.java
@@ -66,6 +66,11 @@ public class DynamicClassLoader extends ClassLoaderBase {
private static final String DYNAMIC_JARS_DIR_KEY = "hbase.dynamic.jars.dir";
+ private static final String DYNAMIC_JARS_OPTIONAL_CONF_KEY = "hbase.use.dynamic.jars";
+ private static final boolean DYNAMIC_JARS_OPTIONAL_DEFAULT = true;
+
+ private boolean useDynamicJars;
+
private File localDir;
// FileSystem of the remote path, set only if remoteDir != null
@@ -86,6 +91,15 @@ public class DynamicClassLoader extends ClassLoaderBase {
final Configuration conf, final ClassLoader parent) {
super(parent);
+ useDynamicJars = conf.getBoolean(
+ DYNAMIC_JARS_OPTIONAL_CONF_KEY, DYNAMIC_JARS_OPTIONAL_DEFAULT);
+
+ if (useDynamicJars) {
+ initTempDir(conf);
+ }
+ }
+
+ private void initTempDir(final Configuration conf) {
jarModifiedTime = new HashMap<String, Long>();
String localDirPath = conf.get(
LOCAL_DIR_KEY, DEFAULT_LOCAL_DIR) + DYNAMIC_JARS_DIR;
@@ -120,7 +134,17 @@ public class DynamicClassLoader extends ClassLoaderBase {
LOG.debug("Class " + name + " not found - using dynamical class loader");
}
- synchronized (getClassLoadingLock(name)) {
+ if (useDynamicJars) {
+ return tryRefreshClass(name);
+ }
+ throw e;
+ }
+ }
+
+
+ private Class<?> tryRefreshClass(String name)
+ throws ClassNotFoundException {
+ synchronized (getClassLoadingLock(name)) {
// Check whether the class has already been loaded:
Class<?> clasz = findLoadedClass(name);
if (clasz != null) {
@@ -149,7 +173,6 @@ public class DynamicClassLoader extends ClassLoaderBase {
}
return clasz;
}
- }
}
private synchronized void loadNewJars() {
http://git-wip-us.apache.org/repos/asf/hbase/blob/12e8076f/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java b/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
index 2f26f4b..612f3f8 100644
--- a/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
+++ b/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestDynamicClassLoader.java
@@ -29,6 +29,7 @@ import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseCommonTestingUtility;
import org.apache.hadoop.hbase.testclassification.SmallTests;
import org.junit.Test;
+import org.junit.Before;
import org.junit.experimental.categories.Category;
/**
@@ -39,10 +40,16 @@ public class TestDynamicClassLoader {
private static final Log LOG = LogFactory.getLog(TestDynamicClassLoader.class);
private static final HBaseCommonTestingUtility TEST_UTIL = new HBaseCommonTestingUtility();
- private static final Configuration conf = TEST_UTIL.getConfiguration();
+ private Configuration conf;
static {
- conf.set("hbase.dynamic.jars.dir", TEST_UTIL.getDataTestDir().toString());
+ TEST_UTIL.getConfiguration().set(
+ "hbase.dynamic.jars.dir", TEST_UTIL.getDataTestDir().toString());
+ }
+
+ @Before
+ public void initializeConfiguration() {
+ conf = new Configuration(TEST_UTIL.getConfiguration());
}
@Test
@@ -94,6 +101,26 @@ public class TestDynamicClassLoader {
}
}
+ @Test
+ public void testLoadClassFromLocalPathWithDynamicDirOff() throws Exception {
+ conf.setBoolean("hbase.use.dynamic.jars", false);
+ ClassLoader parent = TestDynamicClassLoader.class.getClassLoader();
+ DynamicClassLoader classLoader = new DynamicClassLoader(conf, parent);
+
+ String className = "TestLoadClassFromLocalPath";
+ deleteClass(className);
+
+ try {
+ String folder = TEST_UTIL.getDataTestDir().toString();
+ ClassLoaderTestHelper.buildJar(
+ folder, className, null, ClassLoaderTestHelper.localDirPath(conf));
+ classLoader.loadClass(className);
+ fail("Should not be able to load class " + className);
+ } catch (ClassNotFoundException cnfe) {
+ // expected, move on
+ }
+ }
+
private void deleteClass(String className) throws Exception {
String jarFileName = className + ".jar";
File file = new File(TEST_UTIL.getDataTestDir().toString(), jarFileName);