You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by om...@apache.org on 2011/03/04 04:35:54 UTC
svn commit: r1077052 - in
/hadoop/common/branches/branch-0.20-security-patches/src:
hdfs/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java
test/org/apache/hadoop/hdfs/TestDFSRename.java
Author: omalley
Date: Fri Mar 4 03:35:53 2011
New Revision: 1077052
URL: http://svn.apache.org/viewvc?rev=1077052&view=rev
Log:
commit 44d4e8296c2469e80ceeabb6e1f20ac897c83057
Author: Suresh Srinivas <su...@yahoo-inc.com>
Date: Wed Nov 11 17:07:25 2009 -0800
HDFS:761 from https://issues.apache.org/jira/secure/attachment/12424549/hdfs-761.1.rel20.patch
+++ b/YAHOO-CHANGES.txt
+ HDFS-761. Fix failure to process rename operation from edits log
+ due to quota verification. (suresh)
+
Modified:
hadoop/common/branches/branch-0.20-security-patches/src/hdfs/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java
hadoop/common/branches/branch-0.20-security-patches/src/test/org/apache/hadoop/hdfs/TestDFSRename.java
Modified: hadoop/common/branches/branch-0.20-security-patches/src/hdfs/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-patches/src/hdfs/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java?rev=1077052&r1=1077051&r2=1077052&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.20-security-patches/src/hdfs/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java (original)
+++ hadoop/common/branches/branch-0.20-security-patches/src/hdfs/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java Fri Mar 4 03:35:53 2011
@@ -1008,6 +1008,10 @@ class FSDirectory implements FSConstants
*/
private void verifyQuota(INode[] inodes, int pos, long nsDelta, long dsDelta,
INode commonAncestor) throws QuotaExceededException {
+ if (!ready) {
+ // Do not check quota if edits log is still being processed
+ return;
+ }
if (pos>inodes.length) {
pos = inodes.length;
}
@@ -1041,6 +1045,10 @@ class FSDirectory implements FSConstants
*/
private void verifyQuotaForRename(INode[] srcInodes, INode[]dstInodes)
throws QuotaExceededException {
+ if (!ready) {
+ // Do not check quota if edits log is still being processed
+ return;
+ }
INode srcInode = srcInodes[srcInodes.length - 1];
INode commonAncestor = null;
for(int i =0;srcInodes[i] == dstInodes[i]; i++) {
Modified: hadoop/common/branches/branch-0.20-security-patches/src/test/org/apache/hadoop/hdfs/TestDFSRename.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-patches/src/test/org/apache/hadoop/hdfs/TestDFSRename.java?rev=1077052&r1=1077051&r2=1077052&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.20-security-patches/src/test/org/apache/hadoop/hdfs/TestDFSRename.java (original)
+++ hadoop/common/branches/branch-0.20-security-patches/src/test/org/apache/hadoop/hdfs/TestDFSRename.java Fri Mar 4 03:35:53 2011
@@ -27,7 +27,8 @@ import org.apache.hadoop.hdfs.protocol.F
import org.apache.hadoop.hdfs.protocol.QuotaExceededException;
public class TestDFSRename extends junit.framework.TestCase {
- MiniDFSCluster cluster = null;
+ static Configuration CONF = new Configuration();
+ static MiniDFSCluster cluster = null;
static int countLease(MiniDFSCluster cluster) {
return cluster.getNameNode().namesystem.leaseManager.countLease();
}
@@ -36,8 +37,16 @@ public class TestDFSRename extends junit
@Override
protected void setUp() throws Exception {
- Configuration conf = new Configuration();
- cluster = new MiniDFSCluster(conf, 2, true, null);
+ cluster = new MiniDFSCluster(CONF, 2, true, null);
+ }
+
+ private void restartCluster() throws IOException {
+ if (cluster != null) {
+ cluster.shutdown();
+ cluster = null;
+ }
+ cluster = new MiniDFSCluster(CONF, 1, false, null);
+ cluster.waitClusterUp();
}
@Override
@@ -156,6 +165,32 @@ public class TestDFSRename extends junit
rename(dst1, src1, false, true);
}
+ /**
+ * Perform operations such as setting quota, deletion of files, rename and
+ * ensure system can apply edits log during startup.
+ */
+ public void testEditsLog() throws Exception {
+ DistributedFileSystem fs = (DistributedFileSystem) cluster.getFileSystem();
+ Path src1 = new Path(dir, "testEditsLog/srcdir/src1");
+ Path dst1 = new Path(dir, "testEditsLog/dstdir/dst1");
+ createFile(fs, src1);
+ fs.mkdirs(dst1.getParent());
+ createFile(fs, dst1);
+
+ // Set quota so that dst1 parent cannot allow under it new files/directories
+ fs.setQuota(dst1.getParent(), 2, FSConstants.QUOTA_DONT_SET);
+ // Free up quota for a subsequent rename
+ fs.delete(dst1, true);
+ rename(src1, dst1, true, false);
+
+ // Restart the cluster and ensure the above operations can be
+ // loaded from the edits log
+ restartCluster();
+ fs = (DistributedFileSystem)cluster.getFileSystem();
+ assertFalse(fs.exists(src1)); // ensure src1 is already renamed
+ assertTrue(fs.exists(dst1)); // ensure rename dst exists
+ }
+
private void rename(Path src, Path dst, boolean renameSucceeds,
boolean quotaException) throws Exception {
DistributedFileSystem fs = (DistributedFileSystem) cluster.getFileSystem();