Repository: hbase Updated Branches: refs/heads/0.94 7495b6a5c -> 71d197c15
HBASE-11110 Ability to load FilterList class is dependent on context classloader. (Gabriel Reid) Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/71d197c1 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/71d197c1 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/71d197c1 Branch: refs/heads/0.94 Commit: 71d197c15f17bc23c77d811459f7ea8dfb4a551a Parents: 7495b6a Author: Lars Hofhansl <[email protected]> Authored: Thu May 22 10:56:33 2014 -0700 Committer: Lars Hofhansl <[email protected]> Committed: Thu May 22 10:56:33 2014 -0700 ---------------------------------------------------------------------- .../apache/hadoop/hbase/filter/FilterList.java | 22 +++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/71d197c1/src/main/java/org/apache/hadoop/hbase/filter/FilterList.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/hadoop/hbase/filter/FilterList.java b/src/main/java/org/apache/hadoop/hbase/filter/FilterList.java index b9189c3..44baf39 100644 --- a/src/main/java/org/apache/hadoop/hbase/filter/FilterList.java +++ b/src/main/java/org/apache/hadoop/hbase/filter/FilterList.java @@ -59,7 +59,23 @@ public class FilterList implements Filter { MUST_PASS_ONE } - private static final Configuration conf = HBaseConfiguration.create(); + private static final Configuration CONF; + static { + // We don't know which thread will load this class, so we don't know what + // the state of the context classloader will be when this class is loaded. + // HBaseConfiguration.create is dependent on the state of the context + // classloader of the current thread, so we set it to be the classloader + // that was used to load the Filter class to guarantee the consistent + // ability to load this class from any thread + ClassLoader saveCtxCl = Thread.currentThread().getContextClassLoader(); + try { + Thread.currentThread().setContextClassLoader( + Filter.class.getClassLoader()); + CONF = HBaseConfiguration.create(); + } finally { + Thread.currentThread().setContextClassLoader(saveCtxCl); + } + } private static final int MAX_LOG_FILTERS = 5; private Operator operator = Operator.MUST_PASS_ALL; private List<Filter> filters = new ArrayList<Filter>(); @@ -321,7 +337,7 @@ public class FilterList implements Filter { if (size > 0) { filters = new ArrayList<Filter>(size); for (int i = 0; i < size; i++) { - Filter filter = HbaseObjectWritable.readFilter(in, conf); + Filter filter = HbaseObjectWritable.readFilter(in, CONF); filters.add(filter); } } @@ -331,7 +347,7 @@ public class FilterList implements Filter { out.writeByte(operator.ordinal()); out.writeInt(filters.size()); for (Filter filter : filters) { - HbaseObjectWritable.writeObject(out, filter, Writable.class, conf); + HbaseObjectWritable.writeObject(out, filter, Writable.class, CONF); } }
