diff --git a/hdfs/FSDirectory详解.md b/hdfs/FSDirectory详解.md index 6627c62..f931704 100644 --- a/hdfs/FSDirectory详解.md +++ b/hdfs/FSDirectory详解.md @@ -74,4 +74,25 @@ boolean delete(String src, boolean recursive, boolean logRetryCache) throws IOEx **FSDirDeleteOp.delete 实现逻辑** +- 检查权限:调用FSDirectory的函数checkPermission检查权限。 +- 如果是非空的文件夹,检查是否有-r参数。如果没有-r参数则需要报错。 +- 调用deleteInternal,开始删除文件夹。核心删除代码如下: + +```java +List snapshottableDirs = new ArrayList<>(); +FSDirSnapshotOp.checkSnapshot(fsd, iip, snapshottableDirs); +ReclaimContext context = new ReclaimContext( + fsd.getBlockStoragePolicySuite(), collectedBlocks, removedINodes, + removedUCFiles); +// 更核心的删除代码再这个函数里面,会调用destroyAndCollectBlocks删除block,代码:targetNode.destroyAndCollectBlocks(reclaimContext); +if (unprotectedDelete(fsd, iip, context, mtime)) { + filesRemoved = context.quotaDelta().getNsDelta(); + fsn.removeSnapshottableDirs(snapshottableDirs); +} +fsd.updateReplicationFactor(context.collectedBlocks() + .toUpdateReplicationInfo()); +fsd.updateCount(iip, context.quotaDelta(), false); +``` +- 删除EditLog。 +- 调用incrDeletedFileCount更新metrics信息。