[ 
https://issues.apache.org/jira/browse/YARN-5607?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17636485#comment-17636485
 ] 

ASF GitHub Bot commented on YARN-5607:
--------------------------------------

susheel-gupta commented on code in PR #5119:
URL: https://github.com/apache/hadoop/pull/5119#discussion_r1027642975


##########
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/CommonUtil.java:
##########
@@ -0,0 +1,410 @@
+package org.apache.hadoop.yarn.server.resourcemanager;
+
+import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
+import org.apache.hadoop.yarn.api.records.ApplicationId;
+import org.apache.hadoop.yarn.api.records.ContainerId;
+import org.apache.hadoop.yarn.api.records.NodeId;
+import org.apache.hadoop.yarn.api.records.ContainerStatus;
+import org.apache.hadoop.yarn.api.records.NodeState;
+import org.apache.hadoop.yarn.server.api.protocolrecords.NMContainerStatus;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppState;
+import 
org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt;
+import 
org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptState;
+import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainer;
+import 
org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainerState;
+import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode;
+import 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.AbstractYarnScheduler;
+import 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerApplication;
+import org.junit.Assert;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+public class CommonUtil {
+    static final Logger LOG = LoggerFactory.getLogger(MockRM.class);
+    private static final int SECOND = 1000;
+    private static final int TIMEOUT_MS_FOR_ATTEMPT = 40 * SECOND;
+    private static final int TIMEOUT_MS_FOR_APP_REMOVED = 40 * SECOND;
+    private static final int TIMEOUT_MS_FOR_CONTAINER_AND_NODE = 20 * SECOND;
+    private static final int WAIT_MS_PER_LOOP = 10;
+
+    /**
+     * Wait until an application has reached a specified state.
+     * The timeout is 80 seconds.
+     *
+     * @param appId      the id of an application
+     * @param finalState the application state waited
+     * @throws InterruptedException if interrupted while waiting for the state 
transition
+     */
+    public static void waitForState(MockRM rm, ApplicationId appId, RMAppState 
finalState)
+            throws InterruptedException {
+        rm.drainEventsImplicitly();
+        RMApp app = rm.getRMContext().getRMApps().get(appId);
+        Assert.assertNotNull("app shouldn't be null", app);
+        final int timeoutMsecs = 80 * SECOND;
+        int timeWaiting = 0;
+        while (!finalState.equals(app.getState())) {
+            if (timeWaiting >= timeoutMsecs) {
+                break;
+            }
+
+            LOG.info("App : " + appId + " State is : " + app.getState() +
+                    " Waiting for state : " + finalState);
+            Thread.sleep(WAIT_MS_PER_LOOP);
+            timeWaiting += WAIT_MS_PER_LOOP;
+        }
+
+        LOG.info("App State is : " + app.getState());
+        Assert.assertEquals("App State is not correct (timeout).", finalState,
+                app.getState());
+    }
+
+    /**
+     * Wait until an attempt has reached a specified state.
+     * The timeout is 40 seconds.
+     *
+     * @param attemptId  the id of an attempt
+     * @param finalState the attempt state waited
+     * @throws InterruptedException if interrupted while waiting for the state 
transition
+     */
+    public static void waitForState(MockRM rm, ApplicationAttemptId attemptId,
+                             RMAppAttemptState finalState) throws 
InterruptedException {
+        waitForState(rm, attemptId, finalState, TIMEOUT_MS_FOR_ATTEMPT);
+    }
+
+    /**
+     * Wait until an attempt has reached a specified state.
+     * The timeout can be specified by the parameter.
+     *
+     * @param attemptId    the id of an attempt
+     * @param finalState   the attempt state waited
+     * @param timeoutMsecs the length of timeout in milliseconds
+     * @throws InterruptedException if interrupted while waiting for the state 
transition
+     */
+    private static void waitForState(MockRM rm, ApplicationAttemptId attemptId,
+                             RMAppAttemptState finalState, int timeoutMsecs)
+            throws InterruptedException {
+        rm.start();
+        rm.drainEventsImplicitly();
+        RMApp app = 
rm.getRMContext().getRMApps().get(attemptId.getApplicationId());
+        Assert.assertNotNull("app shouldn't be null", app);
+        RMAppAttempt attempt = app.getRMAppAttempt(attemptId);
+        waitForState(attempt, finalState, timeoutMsecs);
+    }
+
+    /**
+     * Wait until an attempt has reached a specified state.
+     * The timeout is 40 seconds.
+     *
+     * @param attempt    an attempt
+     * @param finalState the attempt state waited
+     * @throws InterruptedException if interrupted while waiting for the state 
transition
+     */
+    public static void waitForState(RMAppAttempt attempt,
+                                    RMAppAttemptState finalState) throws 
InterruptedException {
+        waitForState(attempt, finalState, TIMEOUT_MS_FOR_ATTEMPT);
+    }
+
+    /**
+     * Wait until an attempt has reached a specified state.
+     * The timeout can be specified by the parameter.
+     *
+     * @param attempt      an attempt
+     * @param finalState   the attempt state waited
+     * @param timeoutMsecs the length of timeout in milliseconds
+     * @throws InterruptedException if interrupted while waiting for the state 
transition
+     */
+    public static void waitForState(RMAppAttempt attempt,
+                                    RMAppAttemptState finalState, int 
timeoutMsecs)
+            throws InterruptedException {
+        int timeWaiting = 0;
+        while (finalState != attempt.getAppAttemptState()) {
+            if (timeWaiting >= timeoutMsecs) {
+                break;
+            }
+
+            LOG.info("AppAttempt : " + attempt.getAppAttemptId() + " State is 
: " +
+                    attempt.getAppAttemptState() + " Waiting for state : " + 
finalState);
+            Thread.sleep(WAIT_MS_PER_LOOP);
+            timeWaiting += WAIT_MS_PER_LOOP;
+        }
+
+        LOG.info("Attempt State is : " + attempt.getAppAttemptState());
+        Assert.assertEquals("Attempt state is not correct (timeout).", 
finalState,
+                attempt.getState());
+    }
+
+    public static void waitForContainerToComplete(MockRM rm, RMAppAttempt 
attempt,
+                                           NMContainerStatus 
completedContainer) throws InterruptedException {
+        rm.drainEventsImplicitly();
+        int timeWaiting = 0;
+        while (timeWaiting < TIMEOUT_MS_FOR_CONTAINER_AND_NODE) {
+            List<ContainerStatus> containers = 
attempt.getJustFinishedContainers();
+            LOG.info("Received completed containers " + containers);
+            for (ContainerStatus container : containers) {
+                if (container.getContainerId().equals(
+                        completedContainer.getContainerId())) {
+                    return;
+                }
+            }
+            Thread.sleep(WAIT_MS_PER_LOOP);
+            timeWaiting += WAIT_MS_PER_LOOP;
+        }
+    }
+
+    public static MockAM waitForNewAMToLaunchAndRegister(MockRM rm, 
ApplicationId appId, int attemptSize,
+                                                  MockNM nm) throws Exception {
+        RMApp app = rm.getRMContext().getRMApps().get(appId);
+        Assert.assertNotNull(app);
+        int timeWaiting = 0;
+        while (app.getAppAttempts().size() != attemptSize) {
+            if (timeWaiting >= TIMEOUT_MS_FOR_ATTEMPT) {
+                break;
+            }
+            LOG.info("Application " + appId
+                    + " is waiting for AM to restart. Current has "
+                    + app.getAppAttempts().size() + " attempts.");
+            Thread.sleep(WAIT_MS_PER_LOOP);
+            timeWaiting += WAIT_MS_PER_LOOP;
+        }
+        return rm.launchAndRegisterAM(app, rm, nm);
+    }
+
+    /**
+     * Wait until a container has reached a specified state.
+     * The timeout is 10 seconds.

Review Comment:
   @K0K0V0K The timeout is specified by the parameter.They already mentioned 
10, maybe it was calculated or general timeout.





> Document TestContainerResourceUsage#waitForContainerCompletion
> --------------------------------------------------------------
>
>                 Key: YARN-5607
>                 URL: https://issues.apache.org/jira/browse/YARN-5607
>             Project: Hadoop YARN
>          Issue Type: Test
>          Components: resourcemanager, test
>    Affects Versions: 2.9.0
>            Reporter: Karthik Kambatla
>            Assignee: Susheel Gupta
>            Priority: Major
>              Labels: newbie, pull-request-available
>
> The logic in TestContainerResourceUsage#waitForContainerCompletion 
> (introduced in YARN-5024) is not immediately obvious. It could use some 
> documentation. Also, this seems like a useful helper method. Should this be 
> moved to one of the mock classes or to a util class? 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to