|
@@ -24,6 +24,7 @@ import java.io.IOException;
|
|
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 @@ class BlockPoolSliceScanner {
|
|
NONE,
|
|
NONE,
|
|
}
|
|
}
|
|
|
|
|
|
- static class BlockScanInfo implements Comparable<BlockScanInfo> {
|
|
|
|
- Block block;
|
|
|
|
|
|
+ static class BlockScanInfo {
|
|
|
|
+ /** 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 @@ class BlockPoolSliceScanner {
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
- public boolean equals(Object other) {
|
|
|
|
- return other instanceof BlockScanInfo &&
|
|
|
|
- compareTo((BlockScanInfo)other) == 0;
|
|
|
|
|
|
+ public boolean equals(Object that) {
|
|
|
|
+ if (this == that) {
|
|
|
|
+ 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,
|