diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index daf09e90fee..fadf930e8bf 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -917,7 +917,11 @@ Release 0.23.3 - UNRELEASED HDFS-3321. Fix safe mode turn off tip message. (Ravi Prakash via szetszwo) - HDFS-3334. Fix ByteRangeInputStream stream leakage. (Daryn Sharp via szetszwo) + HDFS-3334. Fix ByteRangeInputStream stream leakage. (Daryn Sharp via + szetszwo) + + HDFS-3331. In namenode, check superuser privilege for setBalancerBandwidth + and acquire the write lock for finalizeUpgrade. (szetszwo) Release 0.23.2 - UNRELEASED diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeManager.java index 0c16c7f5d1b..7f795cd4a84 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeManager.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeManager.java @@ -651,7 +651,6 @@ nodes with its data cleared (or user can just remove the StorageID * checks if any of the hosts have changed states: */ public void refreshNodes(final Configuration conf) throws IOException { - namesystem.checkSuperuserPrivilege(); refreshHostsReader(conf); namesystem.writeLock(); try { diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java index c92ee852e43..790212182bb 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java @@ -3332,8 +3332,26 @@ Date getStartTime() { } void finalizeUpgrade() throws IOException { + writeLock(); + try { + checkOperation(OperationCategory.WRITE); + checkSuperuserPrivilege(); + getFSImage().finalizeUpgrade(); + } finally { + writeUnlock(); + } + } + + void refreshNodes() throws IOException { + checkOperation(OperationCategory.UNCHECKED); checkSuperuserPrivilege(); - getFSImage().finalizeUpgrade(); + getBlockManager().getDatanodeManager().refreshNodes(new HdfsConfiguration()); + } + + void setBalancerBandwidth(long bandwidth) throws IOException { + checkOperation(OperationCategory.UNCHECKED); + checkSuperuserPrivilege(); + getBlockManager().getDatanodeManager().setBalancerBandwidth(bandwidth); } /** diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java index af3dd16d768..b61fbe8f00b 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNodeRpcServer.java @@ -707,9 +707,7 @@ public void saveNamespace() throws IOException { @Override // ClientProtocol public void refreshNodes() throws IOException { - namesystem.checkOperation(OperationCategory.UNCHECKED); - namesystem.getBlockManager().getDatanodeManager().refreshNodes( - new HdfsConfiguration()); + namesystem.refreshNodes(); } @Override // NamenodeProtocol @@ -732,7 +730,6 @@ public RemoteEditLogManifest getEditLogManifest(long sinceTxId) @Override // ClientProtocol public void finalizeUpgrade() throws IOException { - namesystem.checkOperation(OperationCategory.WRITE); namesystem.finalizeUpgrade(); } @@ -772,8 +769,7 @@ public CorruptFileBlocks listCorruptFileBlocks(String path, String cookie) */ @Override // ClientProtocol public void setBalancerBandwidth(long bandwidth) throws IOException { - namesystem.checkOperation(OperationCategory.UNCHECKED); - namesystem.getBlockManager().getDatanodeManager().setBalancerBandwidth(bandwidth); + namesystem.setBalancerBandwidth(bandwidth); } @Override // ClientProtocol