Repository: hadoop Updated Branches: refs/heads/branch-2.8 689d19575 -> 9721735ce
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) (cherry picked from commit 4041d2b49e32c7bcf4ec29428b8a85b07b9f74e0) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/9721735c Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/9721735c Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/9721735c Branch: refs/heads/branch-2.8 Commit: 9721735ce979eabdb4fe0c0252fa2c7eebb50b3a Parents: 689d195 Author: Vinod Kumar Vavilapalli <vino...@apache.org> Authored: Mon Apr 11 12:00:51 2016 -0700 Committer: Junping Du <junping...@apache.org> Committed: Thu Jan 5 13:23:47 2017 -0800 ---------------------------------------------------------------------- .../org/apache/hadoop/io/AbstractMapWritable.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/9721735c/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 7dd9e69..44e0bdc 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 @@ -181,20 +181,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); } } } --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-commits-h...@hadoop.apache.org