diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index b1b447aa7d5..b088f269db0 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -161,6 +161,9 @@ Release 2.0.3-alpha - Unreleased HADOOP-9173. Add security token protobuf definition to common and use it in hdfs. (suresh) + HDFS-4030. BlockManager excessBlocksCount and + postponedMisreplicatedBlocksCount should be AtomicLongs. (eli) + OPTIMIZATIONS BUG FIXES diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManager.java index 6feaa29bd9b..ff6661b472b 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManager.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManager.java @@ -33,7 +33,7 @@ import java.util.Map; import java.util.Queue; import java.util.Set; import java.util.TreeMap; -import java.util.TreeSet; +import java.util.concurrent.atomic.AtomicLong; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -108,8 +108,8 @@ public class BlockManager { private volatile long corruptReplicaBlocksCount = 0L; private volatile long underReplicatedBlocksCount = 0L; private volatile long scheduledReplicationBlocksCount = 0L; - private volatile long excessBlocksCount = 0L; - private volatile long postponedMisreplicatedBlocksCount = 0L; + private AtomicLong excessBlocksCount = new AtomicLong(0L); + private AtomicLong postponedMisreplicatedBlocksCount = new AtomicLong(0L); /** Used by metrics */ public long getPendingReplicationBlocksCount() { @@ -133,11 +133,11 @@ public class BlockManager { } /** Used by metrics */ public long getExcessBlocksCount() { - return excessBlocksCount; + return excessBlocksCount.get(); } /** Used by metrics */ public long getPostponedMisreplicatedBlocksCount() { - return postponedMisreplicatedBlocksCount; + return postponedMisreplicatedBlocksCount.get(); } /** Used by metrics */ public int getPendingDataNodeMessageCount() { @@ -1067,7 +1067,7 @@ public class BlockManager { private void postponeBlock(Block blk) { if (postponedMisreplicatedBlocks.add(blk)) { - postponedMisreplicatedBlocksCount++; + postponedMisreplicatedBlocksCount.incrementAndGet(); } } @@ -1599,7 +1599,7 @@ public class BlockManager { "in block map."); } it.remove(); - postponedMisreplicatedBlocksCount--; + postponedMisreplicatedBlocksCount.decrementAndGet(); continue; } MisReplicationResult res = processMisReplicatedBlock(bi); @@ -1609,7 +1609,7 @@ public class BlockManager { } if (res != MisReplicationResult.POSTPONE) { it.remove(); - postponedMisreplicatedBlocksCount--; + postponedMisreplicatedBlocksCount.decrementAndGet(); } } } @@ -2474,7 +2474,7 @@ assert storedBlock.findDatanode(dn) < 0 : "Block " + block excessReplicateMap.put(dn.getStorageID(), excessBlocks); } if (excessBlocks.add(block)) { - excessBlocksCount++; + excessBlocksCount.incrementAndGet(); if(blockLog.isDebugEnabled()) { blockLog.debug("BLOCK* addToExcessReplicate:" + " (" + dn + ", " + block @@ -2522,7 +2522,7 @@ assert storedBlock.findDatanode(dn) < 0 : "Block " + block .getStorageID()); if (excessBlocks != null) { if (excessBlocks.remove(block)) { - excessBlocksCount--; + excessBlocksCount.decrementAndGet(); if(blockLog.isDebugEnabled()) { blockLog.debug("BLOCK* removeStoredBlock: " + block + " is removed from excessBlocks"); @@ -2867,7 +2867,7 @@ assert storedBlock.findDatanode(dn) < 0 : "Block " + block // Remove the block from pendingReplications pendingReplications.remove(block); if (postponedMisreplicatedBlocks.remove(block)) { - postponedMisreplicatedBlocksCount--; + postponedMisreplicatedBlocksCount.decrementAndGet(); } }