You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by cu...@apache.org on 2006/07/26 14:25:05 UTC

svn commit: r425720 - in /lucene/hadoop/trunk: CHANGES.txt src/java/org/apache/hadoop/dfs/FSNamesystem.java

Author: cutting
Date: Wed Jul 26 05:25:05 2006
New Revision: 425720

URL: http://svn.apache.org/viewvc?rev=425720&view=rev
Log:
HADOOP-386.  When removing excess DFS block replicas, remove those on nodes with the least free space first.

Modified:
    lucene/hadoop/trunk/CHANGES.txt
    lucene/hadoop/trunk/src/java/org/apache/hadoop/dfs/FSNamesystem.java

Modified: lucene/hadoop/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/CHANGES.txt?rev=425720&r1=425719&r2=425720&view=diff
==============================================================================
--- lucene/hadoop/trunk/CHANGES.txt (original)
+++ lucene/hadoop/trunk/CHANGES.txt Wed Jul 26 05:25:05 2006
@@ -97,6 +97,9 @@
     that multiple datanode's can be run on a single host.
     (Devaraj Das via cutting)
 
+28. HADOOP-386.  When removing excess DFS block replicas, remove those
+    on nodes with the least space first.  (Johan Oskarson via cutting)
+
 
 Release 0.4.0 - 2006-06-28
 

Modified: lucene/hadoop/trunk/src/java/org/apache/hadoop/dfs/FSNamesystem.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/java/org/apache/hadoop/dfs/FSNamesystem.java?rev=425720&r1=425719&r2=425720&view=diff
==============================================================================
--- lucene/hadoop/trunk/src/java/org/apache/hadoop/dfs/FSNamesystem.java (original)
+++ lucene/hadoop/trunk/src/java/org/apache/hadoop/dfs/FSNamesystem.java Wed Jul 26 05:25:05 2006
@@ -1391,14 +1391,26 @@
      *
      * srcNodes.size() - dstNodes.size() == replication
      *
-     * For now, we choose nodes randomly.  In the future, we might enforce some
-     * kind of policy (like making sure replicates are spread across racks).
+     * We pick node with least free space
+     * In the future, we might enforce some kind of policy 
+     * (like making sure replicates are spread across racks).
      */
     void chooseExcessReplicates(Vector nonExcess, Block b, short replication) {
         while (nonExcess.size() - replication > 0) {
-            int chosenNode = r.nextInt(nonExcess.size());
-            DatanodeDescriptor cur = (DatanodeDescriptor) nonExcess.elementAt(chosenNode);
-            nonExcess.removeElementAt(chosenNode);
+            DatanodeInfo cur = null;
+            long minSpace = Long.MAX_VALUE;
+            
+            for (Iterator iter = nonExcess.iterator(); iter.hasNext();) {
+                DatanodeInfo node = (DatanodeInfo) iter.next();
+                long free = node.getRemaining();
+                
+                if(minSpace > free) {
+                    minSpace = free;
+                    cur = node;
+                }
+            }
+            
+            nonExcess.remove(cur);
 
             TreeSet excessBlocks = (TreeSet) excessReplicateMap.get(cur.getStorageID());
             if (excessBlocks == null) {