diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index a61e3cde492..d5c2a5e6e0c 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -785,6 +785,8 @@ Release 2.7.2 - UNRELEASED HADOOP-12465. Incorrect javadoc in WritableUtils.java. (Jagadesh Kiran N via aajisaka) + HADOOP-12464. Interrupted client may try to fail-over and retry (kihwal) + Release 2.7.1 - 2015-07-06 INCOMPATIBLE CHANGES diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/retry/RetryInvocationHandler.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/retry/RetryInvocationHandler.java index c31d28e12cd..5d94c3b13d2 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/retry/RetryInvocationHandler.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/retry/RetryInvocationHandler.java @@ -105,6 +105,10 @@ public class RetryInvocationHandler implements RpcInvocationHandler { hasMadeASuccessfulCall = true; return ret; } catch (Exception ex) { + if (Thread.currentThread().isInterrupted()) { + // If interrupted, do not retry. + throw ex; + } boolean isIdempotentOrAtMostOnce = proxyProvider.getInterface() .getMethod(method.getName(), method.getParameterTypes()) .isAnnotationPresent(Idempotent.class); diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Client.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Client.java index 19a68d7a0c3..9c70382551f 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Client.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Client.java @@ -1428,22 +1428,16 @@ public class Client { throw new IOException(e); } - boolean interrupted = false; synchronized (call) { while (!call.done) { try { call.wait(); // wait for the result } catch (InterruptedException ie) { - // save the fact that we were interrupted - interrupted = true; + Thread.currentThread().interrupt(); + throw new InterruptedIOException("Call interrupted"); } } - if (interrupted) { - // set the interrupt flag now that we are done waiting - Thread.currentThread().interrupt(); - } - if (call.error != null) { if (call.error instanceof RemoteException) { call.error.fillInStackTrace();