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)
This commit is contained in:
Vinod Kumar Vavilapalli 2016-04-11 12:00:51 -07:00 committed by Junping Du
parent 689d19575f
commit 9721735ce9

View File

@ -181,20 +181,22 @@ public void write(DataOutput out) throws IOException {
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);
}
}
}