HADOOP-13249. RetryInvocationHandler need wrap InterruptedException in IOException when call Thread.sleep. Contributed by Zhihai Xu.
(cherry picked from commit 0bbb4ddd79
)
This commit is contained in:
parent
e91e9e596d
commit
9c7002b122
|
@ -27,6 +27,7 @@ import org.apache.hadoop.ipc.*;
|
|||
import org.apache.hadoop.ipc.Client.ConnectionId;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InterruptedIOException;
|
||||
import java.lang.reflect.InvocationHandler;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
|
@ -297,7 +298,16 @@ public class RetryInvocationHandler<T> implements RpcInvocationHandler {
|
|||
log(method, isFailover, counters.failovers, retryInfo.delay, ex);
|
||||
|
||||
if (retryInfo.delay > 0) {
|
||||
Thread.sleep(retryInfo.delay);
|
||||
try {
|
||||
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) {
|
||||
|
|
|
@ -31,6 +31,7 @@ import org.mockito.invocation.InvocationOnMock;
|
|||
import org.mockito.stubbing.Answer;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InterruptedIOException;
|
||||
import java.lang.reflect.UndeclaredThrowableException;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
|
@ -320,7 +321,9 @@ public class TestRetryProxy {
|
|||
futureThread.get().interrupt();
|
||||
Throwable e = future.get(1, TimeUnit.SECONDS); // should return immediately
|
||||
assertNotNull(e);
|
||||
assertEquals(InterruptedException.class, e.getClass());
|
||||
assertEquals("sleep interrupted", e.getMessage());
|
||||
assertEquals(InterruptedIOException.class, e.getClass());
|
||||
assertEquals("Retry interrupted", e.getMessage());
|
||||
assertEquals(InterruptedException.class, e.getCause().getClass());
|
||||
assertEquals("sleep interrupted", e.getCause().getMessage());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue