其实调用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。