DataNode本地数据存储和管理(六)

2014-11-24 11:52:29 · 作者: · 浏览: 156
umsize = dcs.getChecksumSize();
int bpc = dcs.getBytesPerChecksum();
long n = (newlen - 1)/bpc + 1;//校验和的段数
long newmetalen = BlockMetadataHeader.getHeaderSize() + n*checksumsize;//新的校验和文件的长度
long lastchunkoffset = (n - 1)*bpc;//最后一个校验和字段的偏移位置
int lastchunksize = (int)(newlen - lastchunkoffset); //最后一个校验和的开始位置
byte[] b = new byte[Math.max(lastchunksize, checksumsize)];
RandomAccessFile blockRAF = new RandomAccessFile(blockFile, "rw");//对旧块进行读取
try {
//truncate blockFile
blockRAF.setLength(newlen);//截断旧块
//read last chunk
blockRAF.seek(lastchunkoffset);//读取最后一个校验和字段
blockRAF.readFully(b, 0, lastchunksize);
} finally {
blockRAF.close();
}
//compute checksum
dcs.update(b, 0, lastchunksize);//计算新块的最后一个校验和字段的校验和
dcs.writeva lue(b, 0, false);
//update metaFile
RandomAccessFile metaRAF = new RandomAccessFile(metaFile, "rw");
try {
metaRAF.setLength(newmetalen);//截断旧块的元数据文件
metaRAF.seek(newmetalen - checksumsize);//移到最后一个校验和字段
metaRAF.write(b, 0, checksumsize);//将最后一个校验和字段校验值写入
} finally {
metaRAF.close();
}
}
FSDataset.finalizeBlock用于将tmp目录下的块和元数据文件移动到current下,同时将此块从ongoingcreate近期操作列表中移除,并修改volumeMap中块的位置值。提交(或叫:结束finalize)通过writeToBlock打开的block,返意味着写过程没有出错,可以正式把Block从tmp文件夹放到current文件夹。
FSDataset.unfinalizeBlock的工作相反:将块b从ongoingcreate、volumeMap中清除走。被FSDataset.cleanupBlock调用。
FSDataset.invalidate(Block invalidBlks[])用于将invalidBlks块和相应的元数据文件删除掉,从volumeMap中删除掉这个块记录,同时将更新块所在的卷的空间使用情况。
FSDataset.findBlockFile(long blockId) 用于根据blockId查找对应的快文件:先从ongoingcreate近期访问列表中找,找不到再找volumeMap哈希表。