DataNode端数据存储和管理DataStorage和FSDataset解析(3)

主要的成员变量有3个,我们重点关注的是root,在初始化它被初始化为配置的存储路径中的某一个。下面分析其中的主要方法,先来看我们用到的analyzeStorage方法,这部分代码比较长,就不在贴了,简单的介绍下其中的逻辑。首先判断root这个路径是否已经存在,如果不存在并且目前执行的是StartupOption.FORMAT格式化命令的话,返回StorageState.NON_EXISTENT。在判断root是否是目录或者是否可写,如果有一个不满足返回StorageState.NON_EXISTENT。如果配置的路径存在,首先对文件进行加锁,对文件加锁的一个常用技巧就是建立一个空的filelock文件,将所加在这个空白文件上,通过对这个文件的加锁控制一个目录的同步行为。

469       boolean hasPrevious = getPreviousDir().exists();   470       boolean hasPreviousTmp = getPreviousTmp().exists();   471       boolean hasRemovedTmp = getRemovedTmp().exists();   472       boolean hasFinalizedTmp = getFinalizedTmp().exists();   473       boolean hasCheckpointTmp = getLastCheckpointTmp().exists();  

之后判断个各种状态产什么的标志性文件是否存在,根据不同文件存在的情况返回不同的状态。
根据不同的返回状态,同样是该类中的doRecover方法进行处理,

534     public void doRecover(StorageState curState) throws IOException {   535       File curDir = getCurrentDir();   536       String rootPath = root.getCanonicalPath();   537       switch(curState) {   538       case COMPLETE_UPGRADE:  // mv previous.tmp -> previous    539         LOG.info("Completing previous upgrade for storage directory "   540                  + rootPath + ".");   541         rename(getPreviousTmp(), getPreviousDir());   542         return;  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/10d6a59d1cb7354c7523970371d9c55a.html