主要的成员变量有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方法进行处理,