浏览代码

HADOOP-4388. Datanode should handle invalid blocks and keep transferring the remaining blocks. (Suresh Srinivas via szetszwo)

git-svn-id: https://svn.apache.org/repos/asf/hadoop/core/trunk@711350 13f79535-47bb-0310-9956-ffa450edef68
Tsz-wo Sze 16 年之前
父节点
当前提交
85e876f2d9
共有 2 个文件被更改,包括 38 次插入25 次删除
  1. 4 0
      CHANGES.txt
  2. 34 25
      src/hdfs/org/apache/hadoop/hdfs/server/datanode/DataNode.java

+ 4 - 0
CHANGES.txt

@@ -77,6 +77,10 @@ Trunk (unreleased changes)
     HADOOP-4346. Implement blocking connect so that Hadoop is not affected
     by selector problem with JDK default implementation. (Raghu Angadi)
 
+    HADOOP-4388. If there are invalid blocks in the transfer list, Datanode
+    should handle them and keep transferring the remaining blocks.  (Suresh
+    Srinivas via szetszwo)
+
 Release 0.19.0 - Unreleased
 
   INCOMPATIBLE CHANGES

+ 34 - 25
src/hdfs/org/apache/hadoop/hdfs/server/datanode/DataNode.java

@@ -858,34 +858,43 @@ public class DataNode extends Configured
     um.startUpgrade();
     return;
   }
+
+  private void transferBlock( Block block, 
+                              DatanodeInfo xferTargets[] 
+                              ) throws IOException {
+    if (!data.isValidBlock(block)) {
+      String errStr = "Can't send invalid block " + block;
+      LOG.info(errStr);
+      namenode.errorReport(dnRegistration, 
+                           DatanodeProtocol.INVALID_BLOCK, 
+                           errStr);
+      return;
+    }
+
+    int numTargets = xferTargets.length;
+    if (numTargets > 0) {
+      if (LOG.isInfoEnabled()) {
+        StringBuilder xfersBuilder = new StringBuilder();
+        for (int i = 0; i < numTargets; i++) {
+          xfersBuilder.append(xferTargets[i].getName());
+          xfersBuilder.append(" ");
+        }
+        LOG.info(dnRegistration + " Starting thread to transfer block " + 
+                 block + " to " + xfersBuilder);                       
+      }
+
+      new Daemon(new DataTransfer(xferTargets, block, this)).start();
+    }
+  }
+
   private void transferBlocks( Block blocks[], 
                                DatanodeInfo xferTargets[][] 
-                               ) throws IOException {
+                               ) {
     for (int i = 0; i < blocks.length; i++) {
-      if (!data.isValidBlock(blocks[i])) {
-        String errStr = "Can't send invalid block " + blocks[i];
-        LOG.info(errStr);
-        namenode.errorReport(dnRegistration, 
-                             DatanodeProtocol.INVALID_BLOCK, 
-                             errStr);
-        break;
-      }
-      int numTargets = xferTargets[i].length;
-      if (numTargets > 0) {
-        if (LOG.isInfoEnabled()) {
-          StringBuilder xfersBuilder = new StringBuilder();
-          for (int j = 0; j < numTargets; j++) {
-            DatanodeInfo nodeInfo = xferTargets[i][j];
-            xfersBuilder.append(nodeInfo.getName());
-            if (j < (numTargets - 1)) {
-              xfersBuilder.append(", ");
-            }
-          }
-          String xfersTo = xfersBuilder.toString();
-          LOG.info(dnRegistration + " Starting thread to transfer block " + 
-                   blocks[i] + " to " + xfersTo);                       
-        }
-        new Daemon(new DataTransfer(xferTargets[i], blocks[i], this)).start();
+      try {
+        transferBlock(blocks[i], xferTargets[i]);
+      } catch (IOException ie) {
+        LOG.warn("Failed to transfer block " + blocks[i], ie);
       }
     }
   }