HADOOP-13249. RetryInvocationHandler need wrap InterruptedException in IOException when call Thread.sleep. Contributed by Zhihai Xu.

This commit is contained in:
Jing Zhao 2016-06-10 10:38:13 -07:00
parent 03fc6b1bb0
commit 0bbb4ddd79
2 changed files with 16 additions and 3 deletions

View File

@ -27,6 +27,7 @@ import org.apache.hadoop.ipc.*;
import org.apache.hadoop.ipc.Client.ConnectionId; import org.apache.hadoop.ipc.Client.ConnectionId;
import java.io.IOException; import java.io.IOException;
import java.io.InterruptedIOException;
import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@ -297,7 +298,16 @@ public class RetryInvocationHandler<T> implements RpcInvocationHandler {
log(method, isFailover, counters.failovers, retryInfo.delay, ex); log(method, isFailover, counters.failovers, retryInfo.delay, ex);
if (retryInfo.delay > 0) { if (retryInfo.delay > 0) {
try {
Thread.sleep(retryInfo.delay); Thread.sleep(retryInfo.delay);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
LOG.warn("Interrupted while waiting to retry", e);
InterruptedIOException intIOE = new InterruptedIOException(
"Retry interrupted");
intIOE.initCause(e);
throw intIOE;
}
} }
if (isFailover) { if (isFailover) {

View File

@ -31,6 +31,7 @@ import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer; import org.mockito.stubbing.Answer;
import java.io.IOException; import java.io.IOException;
import java.io.InterruptedIOException;
import java.lang.reflect.UndeclaredThrowableException; import java.lang.reflect.UndeclaredThrowableException;
import java.util.Collections; import java.util.Collections;
import java.util.Map; import java.util.Map;
@ -320,7 +321,9 @@ public class TestRetryProxy {
futureThread.get().interrupt(); futureThread.get().interrupt();
Throwable e = future.get(1, TimeUnit.SECONDS); // should return immediately Throwable e = future.get(1, TimeUnit.SECONDS); // should return immediately
assertNotNull(e); assertNotNull(e);
assertEquals(InterruptedException.class, e.getClass()); assertEquals(InterruptedIOException.class, e.getClass());
assertEquals("sleep interrupted", e.getMessage()); assertEquals("Retry interrupted", e.getMessage());
assertEquals(InterruptedException.class, e.getCause().getClass());
assertEquals("sleep interrupted", e.getCause().getMessage());
} }
} }