Browse Source

HDFS-8813. Erasure Coding: Client no need to decode missing parity blocks. Contributed by Walter Su.

Jing Zhao 10 years ago
parent
commit
c2c26e6ea7

+ 3 - 0
hadoop-hdfs-project/hadoop-hdfs/CHANGES-HDFS-EC-7285.txt

@@ -370,3 +370,6 @@
 
     HDFS-8781. Erasure Coding: Correctly handle BlockManager#InvalidateBlocks for
     striped block. (Yi Liu via jing9)
+
+    HDFS-8813. Erasure Coding: Client no need to decode missing parity blocks.
+    (Walter Su via jing9)

+ 6 - 1
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSStripedInputStream.java

@@ -867,8 +867,13 @@ public class DFSStripedInputStream extends DFSInputStream {
       for (int i = 0; i < alignedStripe.chunks.length; i++) {
         if (alignedStripe.chunks[i] != null &&
             alignedStripe.chunks[i].state == StripingChunk.MISSING) {
-          decodeIndices[pos++] = StripedBlockUtil.convertIndex4Decode(i,
+          int  decodeIndex = StripedBlockUtil.convertIndex4Decode(i,
               dataBlkNum, parityBlkNum);
+          if (i < dataBlkNum) {
+            decodeIndices[pos++] = decodeIndex;
+          } else {
+            decodeInputs[decodeIndex] = null;
+          }
         }
       }
       decodeIndices = Arrays.copyOf(decodeIndices, pos);

+ 1 - 1
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/StripedBlockUtil.java

@@ -326,7 +326,7 @@ public class StripedBlockUtil {
     // Step 1: prepare indices and output buffers for missing data units
     int[] decodeIndices = new int[parityBlkNum];
     int pos = 0;
-    for (int i = 0; i < alignedStripe.chunks.length; i++) {
+    for (int i = 0; i < dataBlkNum; i++) {
       if (alignedStripe.chunks[i] != null &&
           alignedStripe.chunks[i].state == StripingChunk.MISSING){
         decodeIndices[pos++] = convertIndex4Decode(i, dataBlkNum, parityBlkNum);