- BlockPoolSlice#createRbwFile的过程
- FsDatasetImpl#createRbw的源码详解
- 需要构造BlockReceiver的几种情况讨论
从FsDatasetImpl#createRbw,经过FsVolumeImpl#createRbw,最终会调用BlockPoolSlice#createRbwFile的方法。
看下createRbwFile,主要功能就是在rbw目录下根据block的name创建一个文件。
/**
* RBW files. They get moved to the finalized block directory when
* the block is finalized.
*/
File createRbwFile(Block b) throws IOException {
File f = new File(rbwDir, b.getBlockName());
// 如果文件已经存在或创建失败会抛出异常。
File rbwFile = DatanodeUtil.createFileWithExistsCheck(
volume, b, f, fileIoProvider);
// If any exception during creation, its expected that counter will not be
// incremented, So no need to decrement
// BlockPoolSlice的numOfBlocks加1。
incrNumBlocks();
return rbwFile;
}
看FsVolumeImpl#createRbw:
public ReplicaInPipeline createRbw(ExtendedBlock b) throws IOException {
// 调用上面的createRbwFile创建rbw文件
File f = createRbwFile(b.getBlockPoolId(), b.getLocalBlock());
// 构造出LocalReplicaInPipeline对象,这个类我们后面描述
LocalReplicaInPipeline newReplicaInfo = new ReplicaBuilder(ReplicaState.RBW)
.setBlockId(b.getBlockId())
.setGenerationStamp(b.getGenerationStamp())
.setFsVolume(this)
.setDirectoryToUse(f.getParentFile())
.setBytesToReserve(b.getNumBytes())
.buildLocalReplicaInPipeline();
return newReplicaInfo;
}
LocalReplicaInPipeline:
定义了在pipeline中的一个副本,这个副本包括正在被dfs client写入的persistent副本、或者是正在被source datanode做复制的temporary副本,或者是为了做balance正在拷贝的temporary副本。