前言
之前的namenode启动源码是直接编写代码完成,在main方法中调用main方法,此处由于要使用rpc,所以使用MiniCluster即行测试.
1 测试代码
把test中的TestNameNodeRpcServerMethods类修改一下(该类的具体位置参看前章),去掉单元测试的注解,直接使用main方法进行测试.主体代码如下:
2 核心方法
此方法需要和namenode进行rpc,从之前的nnRpc也可以看出.其调用的方法树为:
可以看到,是调用了FSDirMkDirOp的mkdirs方法,其调用树为:
核心方法是createParentDirectories()和createSingleDirectory(),而前者也是循环调用后者,所以最核心方法是createSingleDirectory(),该方法签名为:
其中FSDirectory是目录树,INodesInPath是在路径上的节点,localName是节点名,PermissionStatus是目录权限,从参数可以看出所谓创建节点就是向目录树添加节点并记录而已.其调用的方法树为:
可以看到,果然是首先创建了一个INodeDiretory,再执行addLastNode()方法,加入到当前的目录树中.
3 总结
这里只是借助namenode创建了一个目录,并没有写入数据,所以不需要datanode的参与.可见,namenode只是在jvm进程中维护了一个目录树,并定时持久化到硬盘上而已,具体的数据更新则与datanode有关.