|
@@ -1129,8 +1129,10 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
*/
|
|
|
void metaSave(String filename) throws IOException {
|
|
|
checkSuperuserPrivilege();
|
|
|
+ checkOperation(OperationCategory.UNCHECKED);
|
|
|
writeLock();
|
|
|
try {
|
|
|
+ checkOperation(OperationCategory.UNCHECKED);
|
|
|
File file = new File(System.getProperty("hadoop.log.dir"), filename);
|
|
|
PrintWriter out = new PrintWriter(new BufferedWriter(
|
|
|
new OutputStreamWriter(new FileOutputStream(file, true), Charsets.UTF_8)));
|
|
@@ -1204,6 +1206,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
UnresolvedLinkException, IOException {
|
|
|
HdfsFileStatus resultingStat = null;
|
|
|
FSPermissionChecker pc = getPermissionChecker();
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -1241,6 +1244,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
UnresolvedLinkException, IOException {
|
|
|
HdfsFileStatus resultingStat = null;
|
|
|
FSPermissionChecker pc = getPermissionChecker();
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -1351,13 +1355,20 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
throws FileNotFoundException, UnresolvedLinkException, IOException {
|
|
|
|
|
|
for (int attempt = 0; attempt < 2; attempt++) {
|
|
|
- if (attempt == 0) { // first attempt is with readlock
|
|
|
+ boolean isReadOp = (attempt == 0);
|
|
|
+ if (isReadOp) { // first attempt is with readlock
|
|
|
+ checkOperation(OperationCategory.READ);
|
|
|
readLock();
|
|
|
} else { // second attempt is with write lock
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock(); // writelock is needed to set accesstime
|
|
|
}
|
|
|
try {
|
|
|
- checkOperation(OperationCategory.READ);
|
|
|
+ if (isReadOp) {
|
|
|
+ checkOperation(OperationCategory.READ);
|
|
|
+ } else {
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
+ }
|
|
|
|
|
|
// if the namenode is in safemode, then do not update access time
|
|
|
if (isInSafeMode()) {
|
|
@@ -1370,7 +1381,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
if (now <= inode.getAccessTime() + getAccessTimePrecision()) {
|
|
|
// if we have to set access time but we only have the readlock, then
|
|
|
// restart this entire operation with the writeLock.
|
|
|
- if (attempt == 0) {
|
|
|
+ if (isReadOp) {
|
|
|
continue;
|
|
|
}
|
|
|
}
|
|
@@ -1380,7 +1391,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
inode.computeFileSize(false), inode.isUnderConstruction(),
|
|
|
offset, length, needBlockToken);
|
|
|
} finally {
|
|
|
- if (attempt == 0) {
|
|
|
+ if (isReadOp) {
|
|
|
readUnlock();
|
|
|
} else {
|
|
|
writeUnlock();
|
|
@@ -1436,6 +1447,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
|
|
|
HdfsFileStatus resultingStat = null;
|
|
|
FSPermissionChecker pc = getPermissionChecker();
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -1578,6 +1590,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
}
|
|
|
HdfsFileStatus resultingStat = null;
|
|
|
FSPermissionChecker pc = getPermissionChecker();
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -1618,6 +1631,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
throws IOException, UnresolvedLinkException {
|
|
|
HdfsFileStatus resultingStat = null;
|
|
|
FSPermissionChecker pc = getPermissionChecker();
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -1693,6 +1707,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
blockManager.verifyReplication(src, replication, null);
|
|
|
final boolean isFile;
|
|
|
FSPermissionChecker pc = getPermissionChecker();
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -1723,6 +1738,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
long getPreferredBlockSize(String filename)
|
|
|
throws IOException, UnresolvedLinkException {
|
|
|
FSPermissionChecker pc = getPermissionChecker();
|
|
|
+ checkOperation(OperationCategory.READ);
|
|
|
readLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.READ);
|
|
@@ -1785,6 +1801,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
boolean skipSync = false;
|
|
|
final HdfsFileStatus stat;
|
|
|
FSPermissionChecker pc = getPermissionChecker();
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -1982,6 +1999,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
throws IOException {
|
|
|
boolean skipSync = false;
|
|
|
FSPermissionChecker pc = getPermissionChecker();
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -2119,6 +2137,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
}
|
|
|
LocatedBlock lb = null;
|
|
|
FSPermissionChecker pc = getPermissionChecker();
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -2185,8 +2204,10 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
}
|
|
|
|
|
|
// Part I. Analyze the state of the file with respect to the input data.
|
|
|
+ checkOperation(OperationCategory.READ);
|
|
|
readLock();
|
|
|
try {
|
|
|
+ checkOperation(OperationCategory.READ);
|
|
|
LocatedBlock[] onRetryBlock = new LocatedBlock[1];
|
|
|
final INode[] inodes = analyzeFileState(
|
|
|
src, fileId, clientName, previous, onRetryBlock).getINodes();
|
|
@@ -2213,8 +2234,10 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
// Allocate a new block, add it to the INode and the BlocksMap.
|
|
|
Block newBlock = null;
|
|
|
long offset;
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
// Run the full analysis again, since things could have changed
|
|
|
// while chooseTarget() was executing.
|
|
|
LocatedBlock[] onRetryBlock = new LocatedBlock[1];
|
|
@@ -2368,9 +2391,10 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
final DatanodeDescriptor clientnode;
|
|
|
final long preferredblocksize;
|
|
|
final List<DatanodeDescriptor> chosen;
|
|
|
+ checkOperation(OperationCategory.READ);
|
|
|
readLock();
|
|
|
try {
|
|
|
- checkOperation(OperationCategory.WRITE);
|
|
|
+ checkOperation(OperationCategory.READ);
|
|
|
//check safe mode
|
|
|
if (isInSafeMode()) {
|
|
|
throw new SafeModeException("Cannot add datanode; src=" + src
|
|
@@ -2410,6 +2434,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
boolean abandonBlock(ExtendedBlock b, String src, String holder)
|
|
|
throws LeaseExpiredException, FileNotFoundException,
|
|
|
UnresolvedLinkException, IOException {
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -2487,6 +2512,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
throws SafeModeException, UnresolvedLinkException, IOException {
|
|
|
checkBlock(last);
|
|
|
boolean success = false;
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -2653,6 +2679,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
" to " + dst);
|
|
|
}
|
|
|
FSPermissionChecker pc = getPermissionChecker();
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -2709,6 +2736,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
+ src + " to " + dst);
|
|
|
}
|
|
|
FSPermissionChecker pc = getPermissionChecker();
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -2795,6 +2823,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
IOException {
|
|
|
BlocksMapUpdateInfo collectedBlocks = new BlocksMapUpdateInfo();
|
|
|
FSPermissionChecker pc = getPermissionChecker();
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -2923,6 +2952,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
StandbyException, IOException {
|
|
|
HdfsFileStatus stat = null;
|
|
|
FSPermissionChecker pc = getPermissionChecker();
|
|
|
+ checkOperation(OperationCategory.READ);
|
|
|
readLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.READ);
|
|
@@ -2965,6 +2995,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
NameNode.stateChangeLog.debug("DIR* NameSystem.mkdirs: " + src);
|
|
|
}
|
|
|
FSPermissionChecker pc = getPermissionChecker();
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -3025,6 +3056,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
FileNotFoundException, UnresolvedLinkException, StandbyException {
|
|
|
FSPermissionChecker pc = new FSPermissionChecker(fsOwnerShortUserName,
|
|
|
supergroup);
|
|
|
+ checkOperation(OperationCategory.READ);
|
|
|
readLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.READ);
|
|
@@ -3045,6 +3077,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
void setQuota(String path, long nsQuota, long dsQuota)
|
|
|
throws IOException, UnresolvedLinkException {
|
|
|
checkSuperuserPrivilege();
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -3068,6 +3101,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
void fsync(String src, String clientName, long lastBlockLength)
|
|
|
throws IOException, UnresolvedLinkException {
|
|
|
NameNode.stateChangeLog.info("BLOCK* fsync: " + src + " for " + clientName);
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -3272,6 +3306,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
String[] newtargetstorages)
|
|
|
throws IOException, UnresolvedLinkException {
|
|
|
String src = "";
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -3375,6 +3410,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
* Renew the lease(s) held by the given client
|
|
|
*/
|
|
|
void renewLease(String holder) throws IOException {
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -3416,6 +3452,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
throws AccessControlException, UnresolvedLinkException, IOException {
|
|
|
DirectoryListing dl;
|
|
|
FSPermissionChecker pc = getPermissionChecker();
|
|
|
+ checkOperation(OperationCategory.READ);
|
|
|
readLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.READ);
|
|
@@ -3702,10 +3739,12 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
}
|
|
|
|
|
|
DatanodeInfo[] datanodeReport(final DatanodeReportType type
|
|
|
- ) throws AccessControlException {
|
|
|
+ ) throws AccessControlException, StandbyException {
|
|
|
checkSuperuserPrivilege();
|
|
|
+ checkOperation(OperationCategory.UNCHECKED);
|
|
|
readLock();
|
|
|
try {
|
|
|
+ checkOperation(OperationCategory.UNCHECKED);
|
|
|
final DatanodeManager dm = getBlockManager().getDatanodeManager();
|
|
|
final List<DatanodeDescriptor> results = dm.getDatanodeListForReport(type);
|
|
|
|
|
@@ -3729,8 +3768,10 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
*/
|
|
|
void saveNamespace() throws AccessControlException, IOException {
|
|
|
checkSuperuserPrivilege();
|
|
|
+ checkOperation(OperationCategory.UNCHECKED);
|
|
|
readLock();
|
|
|
try {
|
|
|
+ checkOperation(OperationCategory.UNCHECKED);
|
|
|
if (!isInSafeMode()) {
|
|
|
throw new IOException("Safe mode should be turned ON " +
|
|
|
"in order to create namespace image.");
|
|
@@ -3748,10 +3789,13 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
*
|
|
|
* @throws AccessControlException if superuser privilege is violated.
|
|
|
*/
|
|
|
- boolean restoreFailedStorage(String arg) throws AccessControlException {
|
|
|
+ boolean restoreFailedStorage(String arg) throws AccessControlException,
|
|
|
+ StandbyException {
|
|
|
checkSuperuserPrivilege();
|
|
|
+ checkOperation(OperationCategory.UNCHECKED);
|
|
|
writeLock();
|
|
|
try {
|
|
|
+ checkOperation(OperationCategory.UNCHECKED);
|
|
|
|
|
|
// if it is disabled - enable it and vice versa.
|
|
|
if(arg.equals("check"))
|
|
@@ -3772,6 +3816,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
|
|
|
void finalizeUpgrade() throws IOException {
|
|
|
checkSuperuserPrivilege();
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -4511,6 +4556,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
|
|
|
CheckpointSignature rollEditLog() throws IOException {
|
|
|
checkSuperuserPrivilege();
|
|
|
+ checkOperation(OperationCategory.JOURNAL);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.JOURNAL);
|
|
@@ -4528,6 +4574,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
NamenodeRegistration bnReg, // backup node
|
|
|
NamenodeRegistration nnReg) // active name-node
|
|
|
throws IOException {
|
|
|
+ checkOperation(OperationCategory.CHECKPOINT);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.CHECKPOINT);
|
|
@@ -4546,6 +4593,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
|
|
|
void endCheckpoint(NamenodeRegistration registration,
|
|
|
CheckpointSignature sig) throws IOException {
|
|
|
+ checkOperation(OperationCategory.CHECKPOINT);
|
|
|
readLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.CHECKPOINT);
|
|
@@ -4834,6 +4882,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
* Client is reporting some bad block locations.
|
|
|
*/
|
|
|
void reportBadBlocks(LocatedBlock[] blocks) throws IOException {
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -4868,6 +4917,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
LocatedBlock updateBlockForPipeline(ExtendedBlock block,
|
|
|
String clientName) throws IOException {
|
|
|
LocatedBlock locatedBlock;
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -4899,6 +4949,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
void updatePipeline(String clientName, ExtendedBlock oldBlock,
|
|
|
ExtendedBlock newBlock, DatanodeID[] newNodes)
|
|
|
throws IOException {
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -5026,8 +5077,10 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
*/
|
|
|
void releaseBackupNode(NamenodeRegistration registration)
|
|
|
throws IOException {
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
if(getFSImage().getStorage().getNamespaceID()
|
|
|
!= registration.getNamespaceID())
|
|
|
throw new IOException("Incompatible namespaceIDs: "
|
|
@@ -5066,6 +5119,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
Collection<CorruptFileBlockInfo> listCorruptFileBlocks(String path,
|
|
|
String[] cookieTab) throws IOException {
|
|
|
checkSuperuserPrivilege();
|
|
|
+ checkOperation(OperationCategory.READ);
|
|
|
readLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.READ);
|
|
@@ -5158,6 +5212,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
Token<DelegationTokenIdentifier> getDelegationToken(Text renewer)
|
|
|
throws IOException {
|
|
|
Token<DelegationTokenIdentifier> token;
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -5204,6 +5259,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
long renewDelegationToken(Token<DelegationTokenIdentifier> token)
|
|
|
throws InvalidToken, IOException {
|
|
|
long expiryTime;
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|
|
@@ -5236,6 +5292,7 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
|
|
|
*/
|
|
|
void cancelDelegationToken(Token<DelegationTokenIdentifier> token)
|
|
|
throws IOException {
|
|
|
+ checkOperation(OperationCategory.WRITE);
|
|
|
writeLock();
|
|
|
try {
|
|
|
checkOperation(OperationCategory.WRITE);
|