diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/SerializedExceptionPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/SerializedExceptionPBImpl.java index fd9e170..2ec232e 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/SerializedExceptionPBImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/SerializedExceptionPBImpl.java @@ -101,7 +101,7 @@ public Throwable deSerialize() { } else if (RuntimeException.class.isAssignableFrom(realClass)) { classType = RuntimeException.class; } else { - classType = Exception.class; + classType = Throwable.class; } return instantiateException(realClass.asSubclass(classType), getMessage(), cause == null ? null : cause.deSerialize()); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/records/impl/pb/TestSerializedExceptionPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/records/impl/pb/TestSerializedExceptionPBImpl.java index 480fb9b..c22fca1 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/records/impl/pb/TestSerializedExceptionPBImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/api/records/impl/pb/TestSerializedExceptionPBImpl.java @@ -20,10 +20,9 @@ import java.nio.channels.ClosedChannelException; -import org.junit.Assert; -import org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl; import org.apache.hadoop.yarn.exceptions.YarnRuntimeException; import org.apache.hadoop.yarn.proto.YarnProtos.SerializedExceptionProto; +import org.junit.Assert; import org.junit.Test; public class TestSerializedExceptionPBImpl { @@ -86,4 +85,19 @@ public void testBeforeInit() throws Exception { SerializedExceptionPBImpl pb3 = new SerializedExceptionPBImpl(); Assert.assertEquals(defaultProto.getTrace(), pb3.getRemoteTrace()); } + + @Test + public void testThrowableDeserialization() { + Error ex = new Error(); + SerializedExceptionPBImpl pb = new SerializedExceptionPBImpl(); + try { + pb.deSerialize(); + Assert.fail("deSerialze should throw YarnRuntimeException"); + } catch (YarnRuntimeException e) { + Assert + .assertEquals(ClassNotFoundException.class, e.getCause().getClass()); + } + pb.init(ex); + Assert.assertEquals(ex.getClass(), pb.deSerialize().getClass()); + } }