diff --git hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/retry/TestRetryProxy.java hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/retry/TestRetryProxy.java index 79ea1b9..33ddb89 100644 --- hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/retry/TestRetryProxy.java +++ hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/retry/TestRetryProxy.java @@ -28,6 +28,8 @@ import static org.apache.hadoop.io.retry.RetryPolicies.exponentialBackoffRetry; import static org.junit.Assert.*; +import java.net.ConnectException; + import java.util.Collections; import java.util.Map; import java.util.concurrent.Callable; @@ -112,6 +114,27 @@ public void testRetryForever() throws UnreliableException { } @Test + public void testRetryForeverOnlyOnSpecificExceptions() throws UnreliableException { + Map, RetryPolicy> exceptionToPolicyMap = + Collections., RetryPolicy>singletonMap(ConnectException.class, RETRY_FOREVER); + UnreliableInterface unreliable = (UnreliableInterface) + RetryProxy.create(UnreliableInterface.class, unreliableImpl, + retryByException(TRY_ONCE_THEN_FAIL, exceptionToPolicyMap)); + unreliable.alwaysSucceeds(); + try { + unreliable.failsOnceThenSucceeds(); + fail("should fail as it is expecting to get UnreliableException"); + } catch (UnreliableException e) { + // expected + } + try { + unreliable.failsTenTimesWithConnectionExceptionThenSucceeds(); + } catch (ConnectException e) { + fail("should fail as it should not suppose to get ConnectException for FOREVER retry policy"); + } + } + + @Test public void testRetryUpToMaximumCountWithFixedSleep() throws UnreliableException { UnreliableInterface unreliable = (UnreliableInterface) RetryProxy.create(UnreliableInterface.class, unreliableImpl, @@ -125,7 +148,10 @@ public void testRetryUpToMaximumCountWithFixedSleep() throws UnreliableException // expected } } - + + /** + * Test verifies whether RetryPolicy FOREVER is retrying only on specific exceptions or all kinds of exceptions + */ @Test public void testRetryUpToMaximumTimeWithFixedSleep() throws UnreliableException { UnreliableInterface unreliable = (UnreliableInterface) @@ -140,7 +166,7 @@ public void testRetryUpToMaximumTimeWithFixedSleep() throws UnreliableException // expected } } - + @Test public void testRetryUpToMaximumCountWithProportionalSleep() throws UnreliableException { UnreliableInterface unreliable = (UnreliableInterface) diff --git hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/retry/UnreliableImplementation.java hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/retry/UnreliableImplementation.java index ce9c16e..4e3f190 100644 --- hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/retry/UnreliableImplementation.java +++ hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/retry/UnreliableImplementation.java @@ -19,6 +19,8 @@ import java.io.IOException; +import java.net.ConnectException; + import org.apache.hadoop.ipc.RemoteException; import org.apache.hadoop.ipc.StandbyException; @@ -97,6 +99,13 @@ public void failsTenTimesThenSucceeds() throws UnreliableException { } @Override + public void failsTenTimesWithConnectionExceptionThenSucceeds() throws ConnectException { + if (failsTenTimesInvocationCount++ < 10) { + throw new ConnectException(); + } + } + + @Override public String succeedsOnceThenFailsReturningString() throws UnreliableException, IOException, StandbyException { if (succeedsOnceThenFailsCount++ < 1) { diff --git hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/retry/UnreliableInterface.java hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/retry/UnreliableInterface.java index 3fbe11a..256e166 100644 --- hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/retry/UnreliableInterface.java +++ hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/retry/UnreliableInterface.java @@ -20,6 +20,8 @@ import java.io.IOException; +import java.net.ConnectException; + import org.apache.hadoop.ipc.RemoteException; import org.apache.hadoop.ipc.StandbyException; @@ -73,4 +75,6 @@ public String failsIfIdentifierDoesntMatch(String identifier) void nonIdempotentVoidFailsIfIdentifierDoesntMatch(String identifier) throws UnreliableException, StandbyException, IOException; + + void failsTenTimesWithConnectionExceptionThenSucceeds() throws ConnectException; } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java index 10b9bbb..b67e8c4 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java @@ -1215,4 +1215,40 @@ private ReservationSubmissionRequest createSimpleReservationRequest( ReservationSystemTestUtil.reservationQ); return request; } + + @Test(timeout=30000) + public void testClientWithRetryPolicyForEver() { + ResourceManager rm = null; + YarnClient yarnClient = null; + try { + YarnConfiguration conf = new YarnConfiguration(); + conf.setInt(YarnConfiguration.RESOURCEMANAGER_CONNECT_MAX_WAIT_MS, -1); + + rm = new ResourceManager(); + rm.init(conf); + rm.start(); + + yarnClient = YarnClient.createYarnClient(); + yarnClient.init(conf); + yarnClient.start(); + + ApplicationId appId = ApplicationId.newInstance(1430126768987L, 10645); + Throwable th = null; + try { + ApplicationReport report = yarnClient.getApplicationReport(appId); + Assert.fail("should fail"); + } catch (Throwable e) { + th = e; + //expected + } + Assert.assertTrue(th instanceof ApplicationNotFoundException); + } finally { + if (yarnClient != null) { + yarnClient.stop(); + } + if (rm != null) { + rm.stop(); + } + } + } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/client/RMProxy.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/client/RMProxy.java index fa8d642..28628f3 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/client/RMProxy.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/client/RMProxy.java @@ -224,19 +224,20 @@ public static RetryPolicy createRetryPolicy(Configuration conf) { failoverSleepBaseMs, failoverSleepMaxMs); } - if (waitForEver) { - return RetryPolicies.RETRY_FOREVER; - } - if (rmConnectionRetryIntervalMS < 0) { throw new YarnRuntimeException("Invalid Configuration. " + YarnConfiguration.RESOURCEMANAGER_CONNECT_RETRY_INTERVAL_MS + " should not be negative."); } - RetryPolicy retryPolicy = - RetryPolicies.retryUpToMaximumTimeWithFixedSleep(rmConnectWaitMS, - rmConnectionRetryIntervalMS, TimeUnit.MILLISECONDS); + RetryPolicy retryPolicy = null; + if (waitForEver) { + retryPolicy = RetryPolicies.RETRY_FOREVER; + } else { + retryPolicy = + RetryPolicies.retryUpToMaximumTimeWithFixedSleep(rmConnectWaitMS, + rmConnectionRetryIntervalMS, TimeUnit.MILLISECONDS); + } Map, RetryPolicy> exceptionToPolicyMap = new HashMap, RetryPolicy>();