diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES-HDFS-EC-7285.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES-HDFS-EC-7285.txt index ad1e4e77e1..9741585d74 100755 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES-HDFS-EC-7285.txt +++ b/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) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSStripedInputStream.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSStripedInputStream.java index eecdf67eec..4f3a8eda1d 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSStripedInputStream.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSStripedInputStream.java @@ -867,8 +867,13 @@ void decode() { 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); diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/StripedBlockUtil.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/StripedBlockUtil.java index 3e5ef43198..a3ee1e8219 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/StripedBlockUtil.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/StripedBlockUtil.java @@ -326,7 +326,7 @@ public static void decodeAndFillBuffer(final byte[][] decodeInputs, // 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);