From 3c1f18de4353215acf9b6820774e84010a0be819 Mon Sep 17 00:00:00 2001 From: Jing Zhao Date: Fri, 4 Oct 2013 20:54:06 +0000 Subject: [PATCH] HDFS-5300. FSNameSystem#deleteSnapshot() should not check owner in case of permissions disabled. Contributed by Vinay. git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1529294 13f79535-47bb-0310-9956-ffa450edef68 --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 ++ .../hdfs/server/namenode/FSNamesystem.java | 4 +- .../snapshot/TestSnapshotDeletion.java | 39 ++++++++++++++++++- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index f38e426011..b4024a9372 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -391,6 +391,9 @@ Release 2.1.2 - UNRELEASED HDFS-5289. Race condition in TestRetryCacheWithHA#testCreateSymlink causes spurious test failure. (atm) + HDFS-5300. FSNameSystem#deleteSnapshot() should not check owner in case of + permissions disabled. (Vinay via jing9) + Release 2.1.1-beta - 2013-09-23 INCOMPATIBLE CHANGES 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 429716c32f..5a6d5387c8 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 @@ -6796,7 +6796,9 @@ public class FSNamesystem implements Namesystem, FSClusterStats, throw new SafeModeException( "Cannot delete snapshot for " + snapshotRoot, safeMode); } - checkOwner(pc, snapshotRoot); + if (isPermissionEnabled) { + checkOwner(pc, snapshotRoot); + } BlocksMapUpdateInfo collectedBlocks = new BlocksMapUpdateInfo(); List removedINodes = new ChunkedArrayList(); diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/snapshot/TestSnapshotDeletion.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/snapshot/TestSnapshotDeletion.java index e795673fc0..2408b4efb8 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/snapshot/TestSnapshotDeletion.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/snapshot/TestSnapshotDeletion.java @@ -25,10 +25,12 @@ import static org.junit.Assert.fail; import java.io.FileNotFoundException; import java.io.IOException; +import java.security.PrivilegedAction; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.hdfs.DFSConfigKeys; import org.apache.hadoop.hdfs.DFSTestUtil; import org.apache.hadoop.hdfs.DFSUtil; import org.apache.hadoop.hdfs.DistributedFileSystem; @@ -45,7 +47,9 @@ import org.apache.hadoop.hdfs.server.namenode.INodeFile; import org.apache.hadoop.hdfs.server.namenode.Quota; import org.apache.hadoop.hdfs.server.namenode.snapshot.INodeDirectoryWithSnapshot.DirectoryDiffList; import org.apache.hadoop.hdfs.util.ReadOnlyList; +import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.ipc.RemoteException; +import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.test.GenericTestUtils; import org.junit.After; import org.junit.Before; @@ -777,7 +781,40 @@ public class TestSnapshotDeletion { assertEquals("user1", statusOfS1.getOwner()); assertEquals("group1", statusOfS1.getGroup()); } - + + @Test + public void testDeleteSnapshotWithPermissionsDisabled() throws Exception { + cluster.shutdown(); + Configuration newConf = new Configuration(conf); + newConf.setBoolean(DFSConfigKeys.DFS_PERMISSIONS_ENABLED_KEY, false); + cluster = new MiniDFSCluster.Builder(newConf).numDataNodes(0).build(); + cluster.waitActive(); + hdfs = cluster.getFileSystem(); + + final Path path = new Path("/dir"); + hdfs.mkdirs(path); + hdfs.allowSnapshot(path); + hdfs.mkdirs(new Path(path, "/test")); + hdfs.createSnapshot(path, "s1"); + UserGroupInformation anotherUser = UserGroupInformation + .createRemoteUser("anotheruser"); + anotherUser.doAs(new PrivilegedAction() { + @Override + public Object run() { + DistributedFileSystem anotherUserFS = null; + try { + anotherUserFS = cluster.getFileSystem(); + anotherUserFS.deleteSnapshot(path, "s1"); + } catch (IOException e) { + fail("Failed to delete snapshot : " + e.getLocalizedMessage()); + } finally { + IOUtils.closeStream(anotherUserFS); + } + return null; + } + }); + } + /** * A test covering the case where the snapshot diff to be deleted is renamed * to its previous snapshot.