YARN-4609. RM Nodes list page takes too much time to load. Contributed by Bibin 
A Chundatt


Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/776b549e
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/776b549e
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/776b549e

Branch: refs/heads/HDFS-1312
Commit: 776b549e2ac20a68a5513cbcaac0edc33233dc03
Parents: 552237d
Author: Rohith Sharma K S <rohithsharm...@apache.org>
Authored: Tue Apr 5 14:47:25 2016 +0530
Committer: Rohith Sharma K S <rohithsharm...@apache.org>
Committed: Tue Apr 5 14:47:25 2016 +0530

----------------------------------------------------------------------
 .../resourcemanager/webapp/NodesPage.java       | 53 +++++++++++++-------
 .../resourcemanager/webapp/TestNodesPage.java   | 37 ++++----------
 2 files changed, 45 insertions(+), 45 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/776b549e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/NodesPage.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/NodesPage.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/NodesPage.java
index 9603468..7063421 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/NodesPage.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/NodesPage.java
@@ -18,8 +18,8 @@
 
 package org.apache.hadoop.yarn.server.resourcemanager.webapp;
 
-import static org.apache.hadoop.yarn.webapp.YarnWebParams.NODE_STATE;
 import static org.apache.hadoop.yarn.webapp.YarnWebParams.NODE_LABEL;
+import static org.apache.hadoop.yarn.webapp.YarnWebParams.NODE_STATE;
 import static org.apache.hadoop.yarn.webapp.view.JQueryUI.DATATABLES;
 import static org.apache.hadoop.yarn.webapp.view.JQueryUI.DATATABLES_ID;
 import static org.apache.hadoop.yarn.webapp.view.JQueryUI.initID;
@@ -40,7 +40,6 @@ import org.apache.hadoop.yarn.webapp.SubView;
 import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;
 import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.TABLE;
 import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.TBODY;
-import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.TR;
 import org.apache.hadoop.yarn.webapp.view.HtmlBlock;
 
 import com.google.inject.Inject;
@@ -101,6 +100,7 @@ class NodesPage extends RmView {
           LOG.debug("Unexpected state filter for inactive RM node");
         }
       }
+      StringBuilder nodeTableData = new StringBuilder("[\n");
       for (RMNode ni : rmNodes) {
         if (stateFilter != null) {
           NodeState state = ni.getState();
@@ -129,27 +129,40 @@ class NodesPage extends RmView {
         NodeInfo info = new NodeInfo(ni, sched);
         int usedMemory = (int) info.getUsedMemory();
         int availableMemory = (int) info.getAvailableMemory();
-        TR<TBODY<TABLE<Hamlet>>> row =
-            tbody.tr().td(StringUtils.join(",", info.getNodeLabels()))
-                .td(info.getRack()).td(info.getState()).td(info.getNodeId());
+        nodeTableData.append("[\"")
+            .append(StringUtils.join(",", 
info.getNodeLabels())).append("\",\"")
+            .append(info.getRack()).append("\",\"").append(info.getState())
+            .append("\",\"").append(info.getNodeId());
         if (isInactive) {
-          row.td()._("N/A")._();
+          nodeTableData.append("\",\"").append("N/A").append("\",\"");
         } else {
           String httpAddress = info.getNodeHTTPAddress();
-          row.td().a("//" + httpAddress, httpAddress)._();
+          nodeTableData.append("\",\"<a ").append("href='" + "//" + 
httpAddress)
+              .append("'>").append(httpAddress).append("</a>\",").append("\"");
         }
-        row.td().br().$title(String.valueOf(info.getLastHealthUpdate()))._()
-            ._(Times.format(info.getLastHealthUpdate()))._()
-            .td(info.getHealthReport())
-            .td(String.valueOf(info.getNumContainers())).td().br()
-            .$title(String.valueOf(usedMemory))._()
-            ._(StringUtils.byteDesc(usedMemory * BYTES_IN_MB))._().td().br()
-            .$title(String.valueOf(availableMemory))._()
-            ._(StringUtils.byteDesc(availableMemory * BYTES_IN_MB))._()
-            .td(String.valueOf(info.getUsedVirtualCores()))
-            .td(String.valueOf(info.getAvailableVirtualCores()))
-            .td(ni.getNodeManagerVersion())._();
+        nodeTableData.append("<br title='")
+            .append(String.valueOf(info.getLastHealthUpdate())).append("'>")
+            .append(Times.format(info.getLastHealthUpdate())).append("\",\"")
+            .append(info.getHealthReport()).append("\",\"")
+            .append(String.valueOf(info.getNumContainers())).append("\",\"")
+            .append("<br title='").append(String.valueOf(usedMemory))
+            .append("'>").append(StringUtils.byteDesc(usedMemory * 
BYTES_IN_MB))
+            .append("\",\"").append("<br title='")
+            .append(String.valueOf(availableMemory)).append("'>")
+            .append(StringUtils.byteDesc(availableMemory * BYTES_IN_MB))
+            .append("\",\"").append(String.valueOf(info.getUsedVirtualCores()))
+            .append("\",\"")
+            .append(String.valueOf(info.getAvailableVirtualCores()))
+            .append("\",\"").append(ni.getNodeManagerVersion())
+            .append("\"],\n");
+      }
+      if (nodeTableData.charAt(nodeTableData.length() - 2) == ',') {
+        nodeTableData.delete(nodeTableData.length() - 2,
+            nodeTableData.length() - 1);
       }
+      nodeTableData.append("]");
+      html.script().$type("text/javascript")
+          ._("var nodeTableData=" + nodeTableData)._();
       tbody._()._();
     }
   }
@@ -175,7 +188,9 @@ class NodesPage extends RmView {
   }
 
   private String nodesTableInit() {
-    StringBuilder b = tableInit().append(", aoColumnDefs: [");
+    StringBuilder b = tableInit().append(", 'aaData': nodeTableData")
+        .append(", bDeferRender: true").append(", bProcessing: true")
+        .append(", aoColumnDefs: [");
     b.append("{'bSearchable': false, 'aTargets': [ 7 ]}");
     b.append(", {'sType': 'title-numeric', 'bSearchable': false, "
         + "'aTargets': [ 8, 9 ] }");

http://git-wip-us.apache.org/repos/asf/hadoop/blob/776b549e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestNodesPage.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestNodesPage.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestNodesPage.java
index 0699c0e..71d077b 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestNodesPage.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestNodesPage.java
@@ -81,11 +81,8 @@ public class TestNodesPage {
     Mockito.verify(writer,
         Mockito.times(numberOfActualTableHeaders + numberOfThInMetricsTable))
         .print("<th");
-    Mockito.verify(
-        writer,
-        Mockito.times(numberOfRacks * numberOfNodesPerRack
-            * numberOfActualTableHeaders + numberOfThInMetricsTable)).print(
-        "<td");
+    Mockito.verify(writer, Mockito.times(numberOfThInMetricsTable))
+        .print("<td");
   }
   
   @Test
@@ -99,11 +96,8 @@ public class TestNodesPage {
     Mockito.verify(writer,
         Mockito.times(numberOfActualTableHeaders + numberOfThInMetricsTable))
         .print("<th");
-    Mockito.verify(
-        writer,
-        Mockito.times(numberOfRacks * numberOfLostNodesPerRack
-            * numberOfActualTableHeaders + numberOfThInMetricsTable)).print(
-        "<td");
+    Mockito.verify(writer, Mockito.times(numberOfThInMetricsTable))
+        .print("<td");
   }
   
   @Test
@@ -113,12 +107,9 @@ public class TestNodesPage {
     nodesBlock.render();
     PrintWriter writer = injector.getInstance(PrintWriter.class);
     WebAppTests.flushOutput(injector);
-
-    Mockito.verify(
-        writer,
-        Mockito.times(numberOfRacks
-            * numberOfActualTableHeaders + numberOfThInMetricsTable)).print(
-        "<td");
+    Mockito.verify(writer, Mockito.times(numberOfThInMetricsTable))
+        .print("<td");
+    Mockito.verify(writer, Mockito.times(1)).print("<script");
   }
   
   @Test
@@ -129,11 +120,8 @@ public class TestNodesPage {
     PrintWriter writer = injector.getInstance(PrintWriter.class);
     WebAppTests.flushOutput(injector);
 
-    Mockito.verify(
-        writer,
-        Mockito.times(numberOfRacks * (numberOfNodesPerRack - 1)
-            * numberOfActualTableHeaders + numberOfThInMetricsTable)).print(
-        "<td");
+    Mockito.verify(writer, Mockito.times(numberOfThInMetricsTable))
+        .print("<td");
   }
   
   @Test
@@ -144,10 +132,7 @@ public class TestNodesPage {
     PrintWriter writer = injector.getInstance(PrintWriter.class);
     WebAppTests.flushOutput(injector);
 
-    Mockito.verify(
-        writer,
-        Mockito.times(numberOfRacks * numberOfNodesPerRack
-            * numberOfActualTableHeaders + numberOfThInMetricsTable)).print(
-        "<td");
+    Mockito.verify(writer, Mockito.times(numberOfThInMetricsTable))
+        .print("<td");
   }
 }

Reply via email to