|
@@ -21,6 +21,11 @@ package org.apache.hadoop.yarn.server.resourcemanager.resourcetracker;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
|
|
|
+import org.apache.hadoop.yarn.api.records.NodeState;
|
|
|
+import org.apache.hadoop.yarn.event.DrainDispatcher;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.MockNM;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode;
|
|
|
import org.junit.Assert;
|
|
|
import org.apache.hadoop.conf.Configuration;
|
|
|
import org.apache.hadoop.yarn.api.records.NodeId;
|
|
@@ -189,4 +194,38 @@ public class TestNMReconnect {
|
|
|
nlm.stop();
|
|
|
scheduler.stop();
|
|
|
}
|
|
|
+
|
|
|
+ @Test(timeout = 10000)
|
|
|
+ public void testRMNodeStatusAfterReconnect() throws Exception {
|
|
|
+ // The node(127.0.0.1:1234) reconnected with RM. When it registered with
|
|
|
+ // RM, RM set its lastNodeHeartbeatResponse's id to 0 asynchronously. But
|
|
|
+ // the node's heartbeat come before RM succeeded setting the id to 0.
|
|
|
+ final DrainDispatcher dispatcher = new DrainDispatcher();
|
|
|
+ MockRM rm = new MockRM(){
|
|
|
+ @Override
|
|
|
+ protected Dispatcher createDispatcher() {
|
|
|
+ return dispatcher;
|
|
|
+ }
|
|
|
+ };
|
|
|
+ rm.start();
|
|
|
+ MockNM nm1 =
|
|
|
+ new MockNM("127.0.0.1:1234", 15120, rm.getResourceTrackerService());
|
|
|
+ nm1.registerNode();
|
|
|
+ int i = 0;
|
|
|
+ while(i < 3) {
|
|
|
+ nm1.nodeHeartbeat(true);
|
|
|
+ dispatcher.await();
|
|
|
+ i++;
|
|
|
+ }
|
|
|
+
|
|
|
+ MockNM nm2 =
|
|
|
+ new MockNM("127.0.0.1:1234", 15120, rm.getResourceTrackerService());
|
|
|
+ nm2.registerNode();
|
|
|
+ RMNode rmNode = rm.getRMContext().getRMNodes().get(nm2.getNodeId());
|
|
|
+ nm2.nodeHeartbeat(true);
|
|
|
+ dispatcher.await();
|
|
|
+ Assert.assertEquals("Node is Not in Running state.", NodeState.RUNNING,
|
|
|
+ rmNode.getState());
|
|
|
+ rm.stop();
|
|
|
+ }
|
|
|
}
|