Browse Source

HDFS-16776 Erasure Coding: The length of targets should be checked when DN gets a reconstruction task (#4901)

Kidd5368 2 years ago
parent
commit
9a29075f91

+ 4 - 0
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/erasurecode/StripedReconstructor.java

@@ -288,6 +288,10 @@ abstract class StripedReconstructor {
     return decoder;
   }
 
+  int getNumLiveBlocks(){
+    return liveBitSet.cardinality();
+  }
+
   void cleanup() {
     if (decoder != null) {
       decoder.release();

+ 3 - 1
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/erasurecode/StripedWriter.java

@@ -82,8 +82,10 @@ class StripedWriter {
     assert targetStorageIds != null;
 
     writers = new StripedBlockWriter[targets.length];
-
     targetIndices = new short[targets.length];
+    Preconditions.checkArgument(
+            targetIndices.length <= dataBlkNum + parityBlkNum - reconstructor.getNumLiveBlocks(),
+            "Reconstruction work gets too much targets.");
     Preconditions.checkArgument(targetIndices.length <= parityBlkNum,
         "Too much missed striped blocks.");
     initTargetIndices();