diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRM.java b/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..9856c32 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRM.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRM.java @@ -24,6 +24,10 @@ import java.util.List; import java.util.Map; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.io.DataOutputBuffer; import org.apache.hadoop.security.Credentials; @@ -94,6 +98,8 @@ public class MockRM extends ResourceManager { static final String ENABLE_WEBAPP = "mockrm.webapp.enabled"; + private final ExecutorService waitStateExecutor = + Executors.newSingleThreadExecutor(); public MockRM() { this(new YarnConfiguration()); @@ -120,37 +126,60 @@ protected RMNodeLabelsManager createNodeLabelManager() { return mgr; } - public void waitForState(ApplicationId appId, RMAppState finalState) - throws Exception { - RMApp app = getRMContext().getRMApps().get(appId); + public void waitForState(final ApplicationId appId, + final RMAppState finalState) throws Exception { + final RMApp app = getRMContext().getRMApps().get(appId); Assert.assertNotNull("app shouldn't be null", app); - int timeoutSecs = 0; - while (!finalState.equals(app.getState()) && timeoutSecs++ < 40) { - System.out.println("App : " + appId + " State is : " + app.getState() - + " Waiting for state : " + finalState); - Thread.sleep(2000); - } - System.out.println("App State is : " + app.getState()); - Assert.assertEquals("App state is not correct (timedout)", finalState, - app.getState()); + final CountDownLatch latch = new CountDownLatch(1); + + waitStateExecutor.submit(new Runnable() { + @Override + public void run() { + while (!finalState.equals(app.getState())) { + System.out.println( + "App : " + appId + " State is : " + app.getState() + + " Waiting for state : " + finalState); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + System.out.println(e); + } + } + latch.countDown(); + } + }); + + Assert.assertTrue("App state is not correct (timedout)", + latch.await(80, TimeUnit.SECONDS)); } - public void waitForState(ApplicationAttemptId attemptId, - RMAppAttemptState finalState) + public void waitForState(final ApplicationAttemptId attemptId, + final RMAppAttemptState finalState) throws Exception { 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); - } - System.out.println("Attempt State is : " + attempt.getAppAttemptState()); - Assert.assertEquals("Attempt state is not correct (timedout)", finalState, - attempt.getAppAttemptState()); + final RMAppAttempt attempt = app.getRMAppAttempt(attemptId); + final CountDownLatch latch = new CountDownLatch(1); + + waitStateExecutor.submit(new Runnable() { + @Override + public void run() { + while (!finalState.equals(attempt.getAppAttemptState())) { + System.out.println("AppAttempt : " + attemptId + " State is : " + + attempt.getAppAttemptState() + " Waiting for state : " + + finalState); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + System.out.println(e); + } + } + latch.countDown(); + } + }); + + Assert.assertTrue("Attempt state is not correct (timedout)", + latch.await(40, TimeUnit.SECONDS)); } public void waitForContainerAllocated(MockNM nm, ContainerId containerId)