我上一篇文章写了AuthorizationException,这篇文章写写他的父类AccessControlException。
其实调用AccessControlException的地方还是挺多的,但是最后都到了checkPermission。
checkOwner调用的也是checkPermission。
private FSPermissionChecker checkOwner(String path
) throws AccessControlException, UnresolvedLinkException {
return checkPermission(path, true, null, null, null, null);
}
checkPermission的详细方法:这个方法是在FSNamesystem。
private FSPermissionChecker checkPermission(String path, boolean doCheckOwner,
FsAction ancestorAccess, FsAction parentAccess, FsAction access,
FsAction subAccess) throws AccessControlException, UnresolvedLinkException {
FSPermissionChecker pc = new FSPermissionChecker(
fsOwner.getShortUserName(), supergroup);
if (!pc.isSuper) {
dir.waitForReady();
readLock();
try {
pc.checkPermission(path, dir.rootDir, doCheckOwner,
ancestorAccess, parentAccess, access, subAccess);
} finally {
readUnlock();
}
}
return pc;
}
所以下一步的重点就是checkPermission的调用情况了。
checkPermission的调用
1 DFSClient-->NameNodeRpcServer-->FSNamesystem 如checkTraverse。
2 RPC --> ProtobufRpcEngine--> ClientNamenodeProtocolProtos --> ClientNamenodeProtocolServerSideTranslatorPB--> NameNodeRpcServer -->FSNamesystem
如 checkPathAccess 这个主要是调用callMethod
3 NameNodeAdapter --> FSNamesystem
其实这个和我想的很有差距。我的想法是起码在namaNode和dataNode中出现权限相关的吧。但是却没有发现。nameNode这个应该是分散到了NameNodeRpcServer和NameNodeAdapter 。那么dataNode的呢?
FSNamesystem 里面还有个checkOperation方法,这个做的是很简单的,只是看看是不是读操作,看看系统的配置是否让读,其实就是系统准备好了没,从他抛出的异常也可以看的出来:StandbyException。