this.layoutVersion = FSConstants.LAYOUT_VERSION;
this.namespaceID = newNamespaceID();
this.cTime = 0L;
this.checkpointTime = FSNamesystem.now();
//这个for循环,就是对之前提到的storageDirs列表的遍历,对每个StorageDirectory对象进行format操作
for (Iterator<StorageDirectory> it =
dirIterator(); it.hasNext();) {
StorageDirectory sd = it.next();
//这个功能较简单,主要分两个步骤
//调用clearDirectory完全删除sd所在的目录,然后再创建空目录
//调用saveCurrent创建sd目录下的current目录和fsimage目录及相关文件。具体的创建过程就不分析了,下面的部分就对name目录结构进行分析
format(sd);
}
(5)saveCurrent(sd)过程分析
File curDir = sd.getCurrentDir(); //获取sd目录下的current目录
NameNodeDirType dirType = (NameNodeDirType)sd.getStorageDirType(); //读取目录类型,前面说过,有三种
// save new image or new edits
if (!curDir.exists() && !curDir.mkdir())
throw new IOException("Cannot create directory " + curDir);
if (dirType.isOfType(NameNodeDirType.IMAGE)) //如果是image或imageandedit类型,创建fsimage文件,并写入根目录信息
saveFSImage(getImageFile(sd, NameNodeFile.IMAGE));
if (dirType.isOfType(NameNodeDirType.EDITS))
editLog.createEditLogFile(getImageFile(sd, NameNodeFile.EDITS)); //如果是edit或imageandedit类型,创建edits文件,并写入版本信息
// write version and time files
sd.write(); //写入支持旧版本的fsimage目录内容、写入版本信息到VERSION文件中、写入当前系统时间到fstime目录中
(6)name目录结构分析