loadFSEdits通过对日志文件进行逐条读取,根据每条文件的操作(一个大switch)对文件树进行相应的操作,如:如果是文件删除操作,读出要删除的文件路径和‘先前执行此操作时’(指在NN中执行)的时间戳timestamp(为了更新文件父目录的最近修改时间),然后将SNN内存中的文件树的相应文件删除:
case OP_DELETE: {
numOpDelete++;
int length = in.readInt();
if (length != 2) {
throw new IOException("Incorrect data format. "
+ "delete operation.");
}
path = FSImage.readString(in);
timestamp = readLong(in);
fsDir.unprotectedDelete(path, timestamp);
break;
}
其他操作和从edits读出的内容如下所示:
logOpenFile(OP_ADD):申请lease
OP_ADD
length=5 接下来要读的writeable数(用于序列化中)
path=/user/root/2.txt
replication=3
mtime=1363416261479
atime=1363416261479
blockSize=67108864
numBlocks=0
username=root
groupname=supergroup
u=6 g=4o=4
clientName=DFSClient_-1177280126
clientMachine=127.0.0.1
path(路徂)/replication(副本数,文本形式)/modificationTime(修改时间,文本形式)/accessTime(访问时间,文本
形式)/preferredBlockSize(块大小,文本形式)/BlockInfo[](增强的数据块信息,数组)/permissionStatus(访问控刢
信息)/clientName(客户名)/clientMachine(客户机器名)
logCloseFile(OP_CLOSE):归还lease
OP_CLOSE
length=5
path=/user/root/2.txt
replication=3
mtime=1363416261479
atime=1363416261479
blockSize=67108864
numBlocks=1
blockId=-8541918383982462246
numBytes=33
username=
groupname=
u=0 g=0o=0
clientName=
clientMachine=