From fe069fcf71cb437c00520fe384214d831e1184d7 Mon Sep 17 00:00:00 2001 From: zeekling Date: Sat, 13 Apr 2024 22:08:29 +0800 Subject: [PATCH] =?UTF-8?q?FSDirectory=E8=AF=A6=E8=A7=A3:=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=92=8C=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hdfs/FSDirectory详解.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) 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信息。