diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/ipc/RPCUtil.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/ipc/RPCUtil.java index 35d2acb..a2fefed 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/ipc/RPCUtil.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/ipc/RPCUtil.java @@ -101,6 +101,9 @@ public static Void unwrapAndThrowException(ServiceException se) } else if (IOException.class.isAssignableFrom(realClass)) { throw instantiateException(realClass.asSubclass(IOException.class), re); + } else if (RuntimeException.class.isAssignableFrom(realClass)) { + throw instantiateException( + realClass.asSubclass(RuntimeException.class), re); } else { throw re; } @@ -110,6 +113,9 @@ public static Void unwrapAndThrowException(ServiceException se) } else if (cause instanceof IOException) { // RPC Client exception. throw (IOException) cause; + } else if (cause instanceof RuntimeException) { + // RPC RuntimeException + throw (RuntimeException) cause; } else { // Should not be generated. throw new IOException(se); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/ipc/TestRPCUtil.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/ipc/TestRPCUtil.java index 3131c7b..36ca968 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/ipc/TestRPCUtil.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/ipc/TestRPCUtil.java @@ -65,6 +65,12 @@ public void testRemoteYarnExceptionDerivativeUnwrapping() { } @Test + public void testRemoteRuntimeExceptionUnwrapping() { + Class exception = NullPointerException.class; + verifyRemoteExceptionUnwrapping(exception, exception.getName()); + } + + @Test public void testUnexpectedRemoteExceptionUnwrapping() { // Non IOException, YarnException thrown by the remote side. Class exception = Exception.class; @@ -110,6 +116,23 @@ public void testRPCIOExceptionUnwrapping() { Assert.assertTrue(t.getMessage().contains(message)); } + @Test + public void testRPCRuntimeExceptionUnwrapping() { + String message = "RPCRuntimeExceptionUnwrapping"; + RuntimeException re = new NullPointerException(message); + ServiceException se = new ServiceException(re); + + Throwable t = null; + try { + RPCUtil.unwrapAndThrowException(se); + } catch (Throwable thrown) { + t = thrown; + } + + Assert.assertTrue(NullPointerException.class.isInstance(t)); + Assert.assertTrue(t.getMessage().contains(message)); + } + private void verifyRemoteExceptionUnwrapping( Class expectedLocalException, String realExceptionClassName) {