Sfoglia il codice sorgente

HADOOP-415. Fix a potential namenode performance issue introduced by HADOOP-392. Contributed by Devaraj.

git-svn-id: https://svn.apache.org/repos/asf/lucene/hadoop/trunk@428860 13f79535-47bb-0310-9956-ffa450edef68
Doug Cutting 19 anni fa
parent
commit
82d046f732

+ 2 - 11
src/java/org/apache/hadoop/dfs/FSNamesystem.java

@@ -61,11 +61,6 @@ class FSNamesystem implements FSConstants {
     //
     TreeMap datanodeMap = new TreeMap();
 
-    // 
-    // Stores the datanode.name-->datanodeInfo map. Used for getting a sorted
-    // list of datanodes sorted by their names
-    TreeMap datanodeMapByName = new TreeMap();
-
     //
     // Stores the set of dead datanodes
     TreeMap deaddatanodeMap = new TreeMap();
@@ -1088,10 +1083,8 @@ class FSNamesystem implements FSConstants {
               + "new storageID " + nodeReg.getStorageID() + " assigned." );
         }
         // register new datanode
-        DatanodeDescriptor dinfo;
         datanodeMap.put(nodeReg.getStorageID(), 
-                        (dinfo = new DatanodeDescriptor( nodeReg )));
-        datanodeMapByName.put(nodeReg.getName(), dinfo);
+                        new DatanodeDescriptor( nodeReg ));
         NameNode.stateChangeLog.debug(
             "BLOCK* NameSystem.registerDatanode: "
             + "node registered." );
@@ -1159,7 +1152,6 @@ class FSNamesystem implements FSConstants {
                     +"brand-new heartbeat from "+nodeID.getName() );
             nodeinfo = new DatanodeDescriptor(nodeID, capacity, remaining, xceiverCount);
             datanodeMap.put(nodeinfo.getStorageID(), nodeinfo);
-            datanodeMapByName.put(nodeinfo.getName(), nodeinfo);
             capacityDiff = capacity;
             remainingDiff = remaining;
           } else {
@@ -1216,7 +1208,6 @@ class FSNamesystem implements FSConstants {
     private void removeDatanode( DatanodeDescriptor nodeInfo ) {
       heartbeats.remove(nodeInfo);
       datanodeMap.remove(nodeInfo.getStorageID());
-      datanodeMapByName.remove(nodeInfo.getName());
       deaddatanodeMap.put(nodeInfo.getName(), nodeInfo);
       NameNode.stateChangeLog.debug("BLOCK* NameSystem.removeDatanode: "
               + nodeInfo.getName() + " is removed from datanodeMap");
@@ -1552,7 +1543,7 @@ class FSNamesystem implements FSConstants {
     public void DFSNodesStatus(Vector live, Vector dead) {
         synchronized (heartbeats) {
             synchronized (datanodeMap) {
-                live.addAll(datanodeMapByName.values());
+                live.addAll(datanodeMap.values());
                 dead.addAll(deaddatanodeMap.values());
             }
         }

+ 13 - 1
src/java/org/apache/hadoop/dfs/JspHelper.java

@@ -27,6 +27,7 @@ import org.apache.hadoop.io.*;
 import org.apache.hadoop.conf.*;
 
 public class JspHelper {
+    static FSNamesystem fsn = null;
     static InetSocketAddress nameNodeAddr;
     static Configuration conf = new Configuration();
 
@@ -39,7 +40,7 @@ public class JspHelper {
         nameNodeAddr = DataNode.getDataNode().getNameNodeAddr();
       }
       else {
-        FSNamesystem fsn = FSNamesystem.getFSNamesystem();
+        fsn = FSNamesystem.getFSNamesystem();
         nameNodeAddr = new InetSocketAddress(fsn.getDFSNameNodeMachine(),
                   fsn.getDFSNameNodePort()); 
       }      
@@ -137,6 +138,17 @@ public class JspHelper {
       in.close();
       out.print(new String(buf));
     }
+    public void DFSNodesStatus(Vector live, Vector dead) {
+      if (fsn == null) return;
+      TreeMap nodesSortedByName = new TreeMap();
+      fsn.DFSNodesStatus(live, dead);
+      for (int num = 0; num < live.size(); num++) {
+        DatanodeDescriptor d = (DatanodeDescriptor)live.elementAt(num);
+        nodesSortedByName.put(d.getName(), d);
+      }
+      live.clear();
+      live.addAll(nodesSortedByName.values());
+    }
     public void addTableHeader(JspWriter out) throws IOException {
       out.print("<table border=\"1\""+
                 " cellpadding=\"2\" cellspacing=\"2\">");

+ 12 - 7
src/webapps/dfs/dfshealth.jsp

@@ -11,15 +11,20 @@
   FSNamesystem fsn = FSNamesystem.getFSNamesystem();
   String namenodeLabel = fsn.getDFSNameNodeMachine() + ":" + fsn.getDFSNameNodePort();
   long currentTime;
+  JspHelper jspHelper = new JspHelper();
 
-  public void generateLiveNodeData(JspWriter out, DatanodeInfo d) 
+  public void generateLiveNodeData(JspWriter out, DatanodeDescriptor d) 
     throws IOException {
     long c = d.getCapacity();
     long r = d.getRemaining();
     long u = c - r;
     String cGb = DFSShell.limitDecimal((1.0 * c)/(1024*1024*1024), 2);
     String uGb = DFSShell.limitDecimal((1.0 * u)/(1024*1024*1024), 2);
-    String percentUsed = DFSShell.limitDecimal(((1.0 * u)/c)*100, 2);
+    String percentUsed;
+    if (c > 0) 
+      percentUsed = DFSShell.limitDecimal(((1.0 * u)/c)*100, 2);
+    else
+      percentUsed = "100"; 
     out.print("<td style=\"vertical-align: top;\"> <b>" + 
               d.getName() +
               "</b>&nbsp;<br><i><b>LastContact:</b>&nbsp;" + 
@@ -33,7 +38,7 @@
   public void generateDFSHealthReport(JspWriter out) throws IOException {
     Vector live = new Vector();
     Vector dead = new Vector();
-    fsn.DFSNodesStatus(live, dead);
+    jspHelper.DFSNodesStatus(live, dead);
     if (live.isEmpty() && dead.isEmpty()) {
       out.print("There are no datanodes in the cluster");
     }
@@ -52,8 +57,8 @@
       int max = (live.size() > dead.size()) ? live.size() : dead.size();
       currentTime = System.currentTimeMillis();
       for (i = 0; i < min; i++) {
-        DatanodeInfo l = (DatanodeInfo)live.elementAt(i);
-        DatanodeInfo d = (DatanodeInfo)dead.elementAt(i);
+        DatanodeDescriptor l = (DatanodeDescriptor)live.elementAt(i);
+        DatanodeDescriptor d = (DatanodeDescriptor)dead.elementAt(i);
         out.print("<tr>");
         generateLiveNodeData(out, l);
         out.print("<td style=\"vertical-align: top;\">" + 
@@ -65,12 +70,12 @@
       for (i = min; i < max; i++) {
         out.print("<tr>");
         if (type == 1) {
-          DatanodeInfo l = (DatanodeInfo)live.elementAt(i);
+          DatanodeDescriptor l = (DatanodeDescriptor)live.elementAt(i);
           generateLiveNodeData(out, l);
           out.print("<td style=\"vertical-align: top;\"><br></td>");
         }
         else if (type == 0) {
-          DatanodeInfo d = (DatanodeInfo)dead.elementAt(i);
+          DatanodeDescriptor d = (DatanodeDescriptor)dead.elementAt(i);
           out.print("<td style=\"vertical-align: top;\"><br></td>");
           out.print("<td style=\"vertical-align: top;\">" + 
                     d.getName() +