diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockAM.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockAM.java index e2e3cc1..5e3fa89 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockAM.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockAM.java @@ -21,6 +21,8 @@ import java.lang.reflect.UndeclaredThrowableException; import java.security.PrivilegedExceptionAction; import java.util.ArrayList; +import java.util.Arrays; +import java.util.EnumSet; import java.util.List; import org.junit.Assert; @@ -30,7 +32,6 @@ import org.apache.hadoop.yarn.api.protocolrecords.AllocateRequest; import org.apache.hadoop.yarn.api.protocolrecords.AllocateResponse; import org.apache.hadoop.yarn.api.protocolrecords.FinishApplicationMasterRequest; -import org.apache.hadoop.yarn.api.protocolrecords.FinishApplicationMasterResponse; import org.apache.hadoop.yarn.api.protocolrecords.RegisterApplicationMasterRequest; import org.apache.hadoop.yarn.api.protocolrecords.RegisterApplicationMasterResponse; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; @@ -70,21 +71,35 @@ public void setAMRMProtocol(ApplicationMasterProtocol amRMProtocol, this.amRMProtocol = amRMProtocol; } - public void waitForState(RMAppAttemptState finalState) throws Exception { + public void waitForState(RMAppAttemptState... finalStatesArray) + throws Exception { + EnumSet finalStates + = EnumSet.copyOf(Arrays.asList(finalStatesArray)); RMApp app = context.getRMApps().get(attemptId.getApplicationId()); RMAppAttempt attempt = app.getRMAppAttempt(attemptId); - int timeoutSecs = 0; - while (!finalState.equals(attempt.getAppAttemptState()) - && timeoutSecs++ < 40) { + final int sleepPerLoop = 100; + final int minWaitMsec = 1000; + final int maxWaitMsec = 40000; + int waitingMsec = 0; + int loop = 0; + while (!finalStates.contains(attempt.getAppAttemptState()) + && (waitingMsec < maxWaitMsec)) { System.out - .println("AppAttempt : " + attemptId + " State is : " + .println("AppAttempt : " + attemptId + " State is : " + attempt.getAppAttemptState() - + " Waiting for state : " + finalState); - Thread.sleep(1000); + + " Waiting for state : " + finalStates); + Thread.sleep(sleepPerLoop); + loop++; + waitingMsec = loop * sleepPerLoop; + } + if (waitingMsec < minWaitMsec) { + Thread.sleep(maxWaitMsec - waitingMsec); } System.out.println("AppAttempt State is : " + attempt.getAppAttemptState()); - Assert.assertEquals("AppAttempt state is not correct (timedout)", - finalState, attempt.getAppAttemptState()); + Assert.assertTrue( + "AppAttempt state is not correct (timedout) " + "expected: " + + finalStates + ", " + "actual: " + attempt.getAppAttemptState(), + waitingMsec < maxWaitMsec); } public RegisterApplicationMasterResponse registerAppAttempt() diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRM.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRM.java index 9d0ac27..8d6425a 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRM.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRM.java @@ -21,6 +21,8 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.security.PrivilegedAction; +import java.util.Arrays; +import java.util.EnumSet; import java.util.List; import java.util.Map; @@ -83,6 +85,8 @@ import org.apache.hadoop.yarn.server.resourcemanager.security.ClientToAMTokenSecretManagerInRM; import org.apache.hadoop.yarn.server.resourcemanager.security.NMTokenSecretManagerInRM; import org.apache.hadoop.yarn.server.resourcemanager.security.RMContainerTokenSecretManager; + + import org.apache.hadoop.yarn.util.Records; import org.apache.hadoop.yarn.util.YarnVersionInfo; import org.apache.log4j.Level; @@ -120,37 +124,66 @@ protected RMNodeLabelsManager createNodeLabelManager() { return mgr; } - public void waitForState(ApplicationId appId, RMAppState finalState) + public void waitForState(ApplicationId appId, RMAppState... finalStatesArray) throws Exception { + EnumSet finalStates + = EnumSet.copyOf(Arrays.asList(finalStatesArray)); RMApp app = getRMContext().getRMApps().get(appId); Assert.assertNotNull("app shouldn't be null", app); - int timeoutSecs = 0; - while (!finalState.equals(app.getState()) && timeoutSecs++ < 40) { + final int sleepPerLoop = 100; + final int minWaitMsec = 2000; + final int maxWaitMsec = 80000; + int waitingMsec = 0; + int loop = 0; + while (!finalStates.contains(app.getState()) + && (waitingMsec < maxWaitMsec)) { System.out.println("App : " + appId + " State is : " + app.getState() - + " Waiting for state : " + finalState); - Thread.sleep(2000); + + " Waiting for state : " + finalStates); + Thread.sleep(sleepPerLoop); + loop++; + waitingMsec = loop * sleepPerLoop; } - System.out.println("App State is : " + app.getState()); - Assert.assertEquals("App state is not correct (timedout)", finalState, - app.getState()); + if (waitingMsec < minWaitMsec) { + Thread.sleep(maxWaitMsec - waitingMsec); + } + RMAppState currentState = app.getState(); + System.out.println("App State is : " + currentState); + Assert.assertTrue( + "App State is not correct (timedout) " + "expected: " + finalStates + + ", " + "actual: " + app.getState(), waitingMsec < maxWaitMsec); } public void waitForState(ApplicationAttemptId attemptId, - RMAppAttemptState finalState) + RMAppAttemptState... finalStatesArray) throws Exception { + EnumSet finalStates + = EnumSet.copyOf(Arrays.asList(finalStatesArray)); RMApp app = getRMContext().getRMApps().get(attemptId.getApplicationId()); Assert.assertNotNull("app shouldn't be null", app); RMAppAttempt attempt = app.getRMAppAttempt(attemptId); - int timeoutSecs = 0; - while (!finalState.equals(attempt.getAppAttemptState()) && timeoutSecs++ < 40) { - System.out.println("AppAttempt : " + attemptId - + " State is : " + attempt.getAppAttemptState() - + " Waiting for state : " + finalState); - Thread.sleep(1000); + final int sleepPerLoop = 100; + final int minWaitMsec = 1000; + final int maxWaitMsec = 40000; + int waitingMsec = 0; + int loop = 0; + while (!finalStates.contains(attempt.getAppAttemptState()) + && (waitingMsec < maxWaitMsec)) { + System.out + .println("AppAttempt : " + attemptId + " State is : " + + attempt.getAppAttemptState() + + " Waiting for state : " + finalStates); + Thread.sleep(sleepPerLoop); + loop++; + waitingMsec = loop * sleepPerLoop; + } + if (waitingMsec < minWaitMsec) { + Thread.sleep(maxWaitMsec - waitingMsec); } - System.out.println("Attempt State is : " + attempt.getAppAttemptState()); - Assert.assertEquals("Attempt state is not correct (timedout)", finalState, - attempt.getAppAttemptState()); + System.out.println("AppAttempt State is : " + attempt.getAppAttemptState()); + Assert.assertTrue( + "AppAttempt state is not correct (timedout) " + "expected: " + + finalStates + ", " + "actual: " + attempt.getAppAttemptState(), + waitingMsec < maxWaitMsec); } public void waitForContainerAllocated(MockNM nm, ContainerId containerId)