Repository: hadoop Updated Branches: refs/heads/branch-2.9 f24d3b69b -> a2a50e54f
YARN-8110. AMRMProxy recover should catch for all throwable to avoid premature exit. (Botong Huang via Subru). (cherry picked from commit 00905efab22edd9857e0a3828c201bf70f03cb96) (cherry picked from commit 05246b758590286e9dec9e8ff40cddc138003e12) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/a2a50e54 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/a2a50e54 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/a2a50e54 Branch: refs/heads/branch-2.9 Commit: a2a50e54f0e0a593e163b76fd032716286fd92b1 Parents: f24d3b6 Author: Subru Krishnan <su...@apache.org> Authored: Fri Apr 6 16:31:16 2018 -0700 Committer: Subru Krishnan <su...@apache.org> Committed: Fri Apr 6 16:41:23 2018 -0700 ---------------------------------------------------------------------- .../nodemanager/amrmproxy/AMRMProxyService.java | 2 +- .../amrmproxy/BaseAMRMProxyTest.java | 5 +++ .../amrmproxy/TestAMRMProxyService.java | 42 ++++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/a2a50e54/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/amrmproxy/AMRMProxyService.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/amrmproxy/AMRMProxyService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/amrmproxy/AMRMProxyService.java index 815e39b..86fbb72 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/amrmproxy/AMRMProxyService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/amrmproxy/AMRMProxyService.java @@ -261,7 +261,7 @@ public class AMRMProxyService extends CompositeService implements // Create the intercepter pipeline for the AM initializePipeline(attemptId, user, amrmToken, localToken, entry.getValue(), true, amCred); - } catch (IOException e) { + } catch (Throwable e) { LOG.error("Exception when recovering " + attemptId + ", removing it from NMStateStore and move on", e); this.nmContext.getNMStateStore().removeAMRMProxyAppContext(attemptId); http://git-wip-us.apache.org/repos/asf/hadoop/blob/a2a50e54/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/amrmproxy/BaseAMRMProxyTest.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/amrmproxy/BaseAMRMProxyTest.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/amrmproxy/BaseAMRMProxyTest.java index 56d48ef..0958191 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/amrmproxy/BaseAMRMProxyTest.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/amrmproxy/BaseAMRMProxyTest.java @@ -109,6 +109,11 @@ public abstract class BaseAMRMProxyTest { return this.amrmProxyService; } + protected Context getNMContext() { + Assert.assertNotNull(this.nmContext); + return this.nmContext; + } + @Before public void setUp() throws IOException { this.conf = createConfiguration(); http://git-wip-us.apache.org/repos/asf/hadoop/blob/a2a50e54/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/amrmproxy/TestAMRMProxyService.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/amrmproxy/TestAMRMProxyService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/amrmproxy/TestAMRMProxyService.java index b955311..1eefbd5 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/amrmproxy/TestAMRMProxyService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/amrmproxy/TestAMRMProxyService.java @@ -44,6 +44,7 @@ import org.apache.hadoop.yarn.exceptions.YarnException; import org.apache.hadoop.yarn.security.AMRMTokenIdentifier; import org.apache.hadoop.yarn.server.MockResourceManagerFacade; import org.apache.hadoop.yarn.server.nodemanager.amrmproxy.AMRMProxyService.RequestInterceptorChainWrapper; +import org.apache.hadoop.yarn.server.nodemanager.recovery.NMStateStoreService.RecoveredAMRMProxyState; import org.apache.hadoop.yarn.util.Records; import org.junit.Assert; import org.junit.Test; @@ -634,6 +635,35 @@ public class TestAMRMProxyService extends BaseAMRMProxyTest { } /** + * Test AMRMProxy restart with application recovery failure. + */ + @Test + public void testAppRecoveryFailure() throws YarnException, Exception { + Configuration conf = createConfiguration(); + // Use the MockRequestInterceptorAcrossRestart instead for the chain + conf.set(YarnConfiguration.AMRM_PROXY_INTERCEPTOR_CLASS_PIPELINE, + BadRequestInterceptorAcrossRestart.class.getName()); + + mockRM = new MockResourceManagerFacade(new YarnConfiguration(conf), 0); + + createAndStartAMRMProxyService(conf); + + // Create an app entry in NMSS + registerApplicationMaster(1); + + RecoveredAMRMProxyState state = + getNMContext().getNMStateStore().loadAMRMProxyState(); + Assert.assertEquals(1, state.getAppContexts().size()); + + // AMRMProxy restarts and recover + createAndStartAMRMProxyService(conf); + + state = getNMContext().getNMStateStore().loadAMRMProxyState(); + // The app that failed to recover should have been removed from NMSS + Assert.assertEquals(0, state.getAppContexts().size()); + } + + /** * A mock intercepter implementation that uses the same mockRM instance across * restart. */ @@ -672,4 +702,16 @@ public class TestAMRMProxyService extends BaseAMRMProxyTest { } } + /** + * A mock intercepter implementation that throws when recovering. + */ + public static class BadRequestInterceptorAcrossRestart + extends MockRequestInterceptorAcrossRestart { + + @Override + public void recover(Map<String, byte[]> recoveredDataMap) { + throw new RuntimeException("Kaboom"); + } + } + } --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-commits-h...@hadoop.apache.org