HADOOP-12406. Fixed AbstractMapWritable.readFields to use the thread's ClassLoader to load class instead of System ClassLoader. Contributed by Nadeem Douba.

This commit is contained in:
Vinod Kumar Vavilapalli 2016-04-11 12:00:51 -07:00
parent 2a5da97f81
commit 069c6c62de

View File

@ -181,20 +181,22 @@ public void write(DataOutput out) throws IOException {
public void readFields(DataInput in) throws IOException { public void readFields(DataInput in) throws IOException {
// Get the number of "unknown" classes // Get the number of "unknown" classes
newClasses = in.readByte(); 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 // Then read in the class names and add them to our tables
for (int i = 0; i < newClasses; i++) { for (int i = 0; i < newClasses; i++) {
byte id = in.readByte(); byte id = in.readByte();
String className = in.readUTF(); String className = in.readUTF();
try { try {
addToMap(Class.forName(className), id); addToMap(classLoader.loadClass(className), id);
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
throw new IOException("can't find class: " + className + " because "+ throw new IOException(e);
e.getMessage());
} }
} }
} }