HDFS-4797. BlockScanInfo does not override equals(..) and hashCode() consistently.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1498202 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Tsz-wo Sze 2013-07-01 01:28:22 +00:00
parent 750442812c
commit feb5b9641d
2 changed files with 26 additions and 14 deletions

View File

@ -251,6 +251,9 @@ Release 2.2.0 - UNRELEASED
BUG FIXES BUG FIXES
HDFS-4797. BlockScanInfo does not override equals(..) and hashCode()
consistently. (szetszwo)
Release 2.1.1-beta - UNRELEASED Release 2.1.1-beta - UNRELEASED
INCOMPATIBLE CHANGES INCOMPATIBLE CHANGES

View File

@ -24,6 +24,7 @@
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
@ -80,7 +81,7 @@ class BlockPoolSliceScanner {
private final FsDatasetSpi<? extends FsVolumeSpi> dataset; private final FsDatasetSpi<? extends FsVolumeSpi> dataset;
private final SortedSet<BlockScanInfo> blockInfoSet private final SortedSet<BlockScanInfo> blockInfoSet
= new TreeSet<BlockScanInfo>(); = new TreeSet<BlockScanInfo>(BlockScanInfo.LAST_SCAN_TIME_COMPARATOR);
private final Map<Block, BlockScanInfo> blockMap private final Map<Block, BlockScanInfo> blockMap
= new HashMap<Block, BlockScanInfo>(); = new HashMap<Block, BlockScanInfo>();
@ -107,8 +108,20 @@ private static enum ScanType {
NONE, NONE,
} }
static class BlockScanInfo implements Comparable<BlockScanInfo> { static class BlockScanInfo {
Block block; /** Compare the info by the last scan time. */
static final Comparator<BlockScanInfo> LAST_SCAN_TIME_COMPARATOR
= new Comparator<BlockPoolSliceScanner.BlockScanInfo>() {
@Override
public int compare(BlockScanInfo left, BlockScanInfo right) {
final long l = left.lastScanTime;
final long r = right.lastScanTime;
return l < r? -1: l > r? 1: 0;
}
};
final Block block;
long lastScanTime = 0; long lastScanTime = 0;
ScanType lastScanType = ScanType.NONE; ScanType lastScanType = ScanType.NONE;
boolean lastScanOk = true; boolean lastScanOk = true;
@ -123,22 +136,18 @@ public int hashCode() {
} }
@Override @Override
public boolean equals(Object other) { public boolean equals(Object that) {
return other instanceof BlockScanInfo && if (this == that) {
compareTo((BlockScanInfo)other) == 0; return true;
} else if (that == null || !(that instanceof BlockScanInfo)) {
return false;
}
return block.equals(((BlockScanInfo)that).block);
} }
long getLastScanTime() { long getLastScanTime() {
return (lastScanType == ScanType.NONE) ? 0 : lastScanTime; return (lastScanType == ScanType.NONE) ? 0 : lastScanTime;
} }
@Override
public int compareTo(BlockScanInfo other) {
long t1 = lastScanTime;
long t2 = other.lastScanTime;
return ( t1 < t2 ) ? -1 :
(( t1 > t2 ) ? 1 : block.compareTo(other.block));
}
} }
BlockPoolSliceScanner(String bpid, DataNode datanode, BlockPoolSliceScanner(String bpid, DataNode datanode,