diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeDescriptor.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeDescriptor.java index 352238b7f70d1..40ee576378a8e 100755 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeDescriptor.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeDescriptor.java @@ -18,6 +18,7 @@ package org.apache.hadoop.hdfs.server.blockmanagement; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.EnumSet; @@ -27,6 +28,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Queue; import java.util.Set; @@ -80,6 +82,15 @@ public static class BlockTargetPair { this.block = block; this.targets = targets; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BlockTargetPair that = (BlockTargetPair) o; + return Objects.equals(block, that.block) && + Arrays.equals(targets, that.targets); + } } /** A BlockTargetPair queue. */ @@ -686,7 +697,11 @@ public void decrementPendingReplicationWithoutTargets() { public void addBlockToBeReplicated(Block block, DatanodeStorageInfo[] targets) { assert(block != null && targets != null && targets.length > 0); - replicateBlocks.offer(new BlockTargetPair(block, targets)); + BlockTargetPair blockTargetPair = new BlockTargetPair(block, targets); + if (!replicateBlocks.contains(blockTargetPair)) { + return; + } + replicateBlocks.offer(blockTargetPair); } /**