FSDirectory详解:接口 #25
@ -109,3 +109,40 @@ HdfsFileStatus startFile(String src, PermissionStatus permissions,
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
- 检查当前用户是否有写权限。
|
||||||
|
- 检查是否处于安全模式,如果处于安全模式,则不能进行当前操作。
|
||||||
|
- 检查是否对当前文件所在的目录是否有权限(开启权限管理的情况下)
|
||||||
|
- 调用FSDirWriteFileOp.startFile开始创建文件或者覆盖已有文件。
|
||||||
|
- 对于已经存在的文件。在覆盖的场景下。主要核心代码如下,会将原来的文件删除。并且释放租约。
|
||||||
|
```java
|
||||||
|
List<INode> toRemoveINodes = new ChunkedArrayList<>();
|
||||||
|
List<Long> toRemoveUCFiles = new ChunkedArrayList<>();
|
||||||
|
long ret = FSDirDeleteOp.delete(fsd, iip, toRemoveBlocks,
|
||||||
|
toRemoveINodes, toRemoveUCFiles, now());
|
||||||
|
if (ret >= 0) {
|
||||||
|
iip = INodesInPath.replace(iip, iip.length() - 1, null);
|
||||||
|
FSDirDeleteOp.incrDeletedFileCount(ret);
|
||||||
|
fsn.removeLeasesAndINodes(toRemoveUCFiles, toRemoveINodes, true);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
- 对于不需要覆盖的场景下,需要重新刷新租约信息。
|
||||||
|
```java
|
||||||
|
fsn.recoverLeaseInternal(FSNamesystem.RecoverLeaseOp.CREATE_FILE, iip,
|
||||||
|
src, holder, clientMachine, false);
|
||||||
|
```
|
||||||
|
- 对于父文件夹存在的时候,将文件添加到父文件夹下面。
|
||||||
|
```java
|
||||||
|
iip = addFile(fsd, parent, iip.getLastLocalName(), permissions,
|
||||||
|
replication, blockSize, holder, clientMachine, shouldReplicate,
|
||||||
|
ecPolicyName, storagePolicy);
|
||||||
|
newNode = iip != null ? iip.getLastINode().asFile() : null;
|
||||||
|
```
|
||||||
|
- 添加租约信息。
|
||||||
|
```java
|
||||||
|
fsn.leaseManager.addLease(
|
||||||
|
newNode.getFileUnderConstructionFeature().getClientName(),
|
||||||
|
newNode.getId());
|
||||||
|
```
|
||||||
|
- 返回文件信息。
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user