Repository: hadoop Updated Branches: refs/heads/branch-2.7 c748ced47 -> 66072070d
HADOOP-12406. Fixed AbstractMapWritable.readFields to use the thread's ClassLoader to load class instead of System ClassLoader. Contributed by Nadeem Douba. (cherry picked from commit 069c6c62def4a0f94382e9f149581d8e22f6d31c) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/66072070 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/66072070 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/66072070 Branch: refs/heads/branch-2.7 Commit: 66072070d0c07573235a3c26a5b97fc6905c213a Parents: c748ced Author: Vinod Kumar Vavilapalli <[email protected]> Authored: Mon Apr 11 12:00:51 2016 -0700 Committer: Vinod Kumar Vavilapalli <[email protected]> Committed: Mon Apr 11 12:04:12 2016 -0700 ---------------------------------------------------------------------- .../org/apache/hadoop/io/AbstractMapWritable.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/66072070/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/AbstractMapWritable.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/AbstractMapWritable.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/AbstractMapWritable.java index cc1e517..0aa4b70 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/AbstractMapWritable.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/AbstractMapWritable.java @@ -197,20 +197,22 @@ public abstract class AbstractMapWritable implements Writable, Configurable { public void readFields(DataInput in) throws IOException { // Get the number of "unknown" classes - newClasses = in.readByte(); - + + // Use the classloader of the current thread to load classes instead of the + // system-classloader so as to support both client-only and inside-a-MR-job + // use-cases. The context-loader by default eventually falls back to the + // system one, so there should be no cases where changing this is an issue. + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + // Then read in the class names and add them to our tables - for (int i = 0; i < newClasses; i++) { byte id = in.readByte(); String className = in.readUTF(); try { - addToMap(Class.forName(className), id); - + addToMap(classLoader.loadClass(className), id); } catch (ClassNotFoundException e) { - throw new IOException("can't find class: " + className + " because "+ - e.getMessage()); + throw new IOException(e); } } }
