|
@@ -35,9 +35,9 @@ import org.apache.hadoop.hdfs.protocol.Block;
|
|
|
import org.apache.hadoop.hdfs.protocol.BlockListAsLongs;
|
|
|
import org.apache.hadoop.hdfs.protocol.ExtendedBlock;
|
|
|
import org.apache.hadoop.hdfs.server.common.FileRegion;
|
|
|
-import org.apache.hadoop.hdfs.server.common.FileRegionProvider;
|
|
|
import org.apache.hadoop.hdfs.server.common.Storage.StorageDirectory;
|
|
|
-import org.apache.hadoop.hdfs.server.common.TextFileRegionProvider;
|
|
|
+import org.apache.hadoop.hdfs.server.common.blockaliasmap.BlockAliasMap;
|
|
|
+import org.apache.hadoop.hdfs.server.common.blockaliasmap.impl.TextFileRegionAliasMap;
|
|
|
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.ReplicaState;
|
|
|
import org.apache.hadoop.hdfs.server.datanode.ReplicaInPipeline;
|
|
|
import org.apache.hadoop.hdfs.server.datanode.ReplicaInfo;
|
|
@@ -68,7 +68,7 @@ public class ProvidedVolumeImpl extends FsVolumeImpl {
|
|
|
static class ProvidedBlockPoolSlice {
|
|
|
private ProvidedVolumeImpl providedVolume;
|
|
|
|
|
|
- private FileRegionProvider provider;
|
|
|
+ private BlockAliasMap<FileRegion> aliasMap;
|
|
|
private Configuration conf;
|
|
|
private String bpid;
|
|
|
private ReplicaMap bpVolumeMap;
|
|
@@ -77,29 +77,35 @@ public class ProvidedVolumeImpl extends FsVolumeImpl {
|
|
|
Configuration conf) {
|
|
|
this.providedVolume = volume;
|
|
|
bpVolumeMap = new ReplicaMap(new AutoCloseableLock());
|
|
|
- Class<? extends FileRegionProvider> fmt =
|
|
|
- conf.getClass(DFSConfigKeys.DFS_PROVIDER_CLASS,
|
|
|
- TextFileRegionProvider.class, FileRegionProvider.class);
|
|
|
- provider = ReflectionUtils.newInstance(fmt, conf);
|
|
|
+ Class<? extends BlockAliasMap> fmt =
|
|
|
+ conf.getClass(DFSConfigKeys.DFS_PROVIDED_ALIASMAP_CLASS,
|
|
|
+ TextFileRegionAliasMap.class, BlockAliasMap.class);
|
|
|
+ aliasMap = ReflectionUtils.newInstance(fmt, conf);
|
|
|
this.conf = conf;
|
|
|
this.bpid = bpid;
|
|
|
bpVolumeMap.initBlockPool(bpid);
|
|
|
- LOG.info("Created provider: " + provider.getClass());
|
|
|
+ LOG.info("Created alias map using class: " + aliasMap.getClass());
|
|
|
}
|
|
|
|
|
|
- FileRegionProvider getFileRegionProvider() {
|
|
|
- return provider;
|
|
|
+ BlockAliasMap<FileRegion> getBlockAliasMap() {
|
|
|
+ return aliasMap;
|
|
|
}
|
|
|
|
|
|
@VisibleForTesting
|
|
|
- void setFileRegionProvider(FileRegionProvider newProvider) {
|
|
|
- this.provider = newProvider;
|
|
|
+ void setFileRegionProvider(BlockAliasMap<FileRegion> blockAliasMap) {
|
|
|
+ this.aliasMap = blockAliasMap;
|
|
|
}
|
|
|
|
|
|
public void getVolumeMap(ReplicaMap volumeMap,
|
|
|
RamDiskReplicaTracker ramDiskReplicaMap, FileSystem remoteFS)
|
|
|
throws IOException {
|
|
|
- Iterator<FileRegion> iter = provider.iterator();
|
|
|
+ BlockAliasMap.Reader<FileRegion> reader = aliasMap.getReader(null);
|
|
|
+ if (reader == null) {
|
|
|
+ LOG.warn("Got null reader from BlockAliasMap " + aliasMap
|
|
|
+ + "; no blocks will be populated");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ Iterator<FileRegion> iter = reader.iterator();
|
|
|
while (iter.hasNext()) {
|
|
|
FileRegion region = iter.next();
|
|
|
if (region.getBlockPoolId() != null
|
|
@@ -140,14 +146,20 @@ public class ProvidedVolumeImpl extends FsVolumeImpl {
|
|
|
public void compileReport(LinkedList<ScanInfo> report,
|
|
|
ReportCompiler reportCompiler)
|
|
|
throws IOException, InterruptedException {
|
|
|
- /* refresh the provider and return the list of blocks found.
|
|
|
+ /* refresh the aliasMap and return the list of blocks found.
|
|
|
* the assumption here is that the block ids in the external
|
|
|
* block map, after the refresh, are consistent with those
|
|
|
* from before the refresh, i.e., for blocks which did not change,
|
|
|
* the ids remain the same.
|
|
|
*/
|
|
|
- provider.refresh();
|
|
|
- Iterator<FileRegion> iter = provider.iterator();
|
|
|
+ aliasMap.refresh();
|
|
|
+ BlockAliasMap.Reader<FileRegion> reader = aliasMap.getReader(null);
|
|
|
+ if (reader == null) {
|
|
|
+ LOG.warn("Got null reader from BlockAliasMap " + aliasMap
|
|
|
+ + "; no blocks will be populated in scan report");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ Iterator<FileRegion> iter = reader.iterator();
|
|
|
while(iter.hasNext()) {
|
|
|
reportCompiler.throttle();
|
|
|
FileRegion region = iter.next();
|
|
@@ -284,15 +296,15 @@ public class ProvidedVolumeImpl extends FsVolumeImpl {
|
|
|
|
|
|
private String bpid;
|
|
|
private String name;
|
|
|
- private FileRegionProvider provider;
|
|
|
+ private BlockAliasMap<FileRegion> blockAliasMap;
|
|
|
private Iterator<FileRegion> blockIterator;
|
|
|
private ProvidedBlockIteratorState state;
|
|
|
|
|
|
ProviderBlockIteratorImpl(String bpid, String name,
|
|
|
- FileRegionProvider provider) {
|
|
|
+ BlockAliasMap<FileRegion> blockAliasMap) {
|
|
|
this.bpid = bpid;
|
|
|
this.name = name;
|
|
|
- this.provider = provider;
|
|
|
+ this.blockAliasMap = blockAliasMap;
|
|
|
rewind();
|
|
|
}
|
|
|
|
|
@@ -330,7 +342,17 @@ public class ProvidedVolumeImpl extends FsVolumeImpl {
|
|
|
|
|
|
@Override
|
|
|
public void rewind() {
|
|
|
- blockIterator = provider.iterator();
|
|
|
+ BlockAliasMap.Reader<FileRegion> reader = null;
|
|
|
+ try {
|
|
|
+ reader = blockAliasMap.getReader(null);
|
|
|
+ } catch (IOException e) {
|
|
|
+ LOG.warn("Exception in getting reader from provided alias map");
|
|
|
+ }
|
|
|
+ if (reader != null) {
|
|
|
+ blockIterator = reader.iterator();
|
|
|
+ } else {
|
|
|
+ blockIterator = null;
|
|
|
+ }
|
|
|
state = new ProvidedBlockIteratorState();
|
|
|
}
|
|
|
|
|
@@ -372,14 +394,14 @@ public class ProvidedVolumeImpl extends FsVolumeImpl {
|
|
|
@Override
|
|
|
public BlockIterator newBlockIterator(String bpid, String name) {
|
|
|
return new ProviderBlockIteratorImpl(bpid, name,
|
|
|
- bpSlices.get(bpid).getFileRegionProvider());
|
|
|
+ bpSlices.get(bpid).getBlockAliasMap());
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public BlockIterator loadBlockIterator(String bpid, String name)
|
|
|
throws IOException {
|
|
|
ProviderBlockIteratorImpl iter = new ProviderBlockIteratorImpl(bpid, name,
|
|
|
- bpSlices.get(bpid).getFileRegionProvider());
|
|
|
+ bpSlices.get(bpid).getBlockAliasMap());
|
|
|
iter.load();
|
|
|
return iter;
|
|
|
}
|
|
@@ -425,8 +447,8 @@ public class ProvidedVolumeImpl extends FsVolumeImpl {
|
|
|
}
|
|
|
|
|
|
@VisibleForTesting
|
|
|
- FileRegionProvider getFileRegionProvider(String bpid) throws IOException {
|
|
|
- return getProvidedBlockPoolSlice(bpid).getFileRegionProvider();
|
|
|
+ BlockAliasMap<FileRegion> getBlockFormat(String bpid) throws IOException {
|
|
|
+ return getProvidedBlockPoolSlice(bpid).getBlockAliasMap();
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -571,12 +593,12 @@ public class ProvidedVolumeImpl extends FsVolumeImpl {
|
|
|
}
|
|
|
|
|
|
@VisibleForTesting
|
|
|
- void setFileRegionProvider(String bpid, FileRegionProvider provider)
|
|
|
- throws IOException {
|
|
|
+ void setFileRegionProvider(String bpid,
|
|
|
+ BlockAliasMap<FileRegion> blockAliasMap) throws IOException {
|
|
|
ProvidedBlockPoolSlice bp = bpSlices.get(bpid);
|
|
|
if (bp == null) {
|
|
|
throw new IOException("block pool " + bpid + " is not found");
|
|
|
}
|
|
|
- bp.setFileRegionProvider(provider);
|
|
|
+ bp.setFileRegionProvider(blockAliasMap);
|
|
|
}
|
|
|
}
|