You are viewing a plain text version of this content. The canonical link for it is here.
Posted to hdfs-commits@hadoop.apache.org by su...@apache.org on 2012/02/15 23:02:16 UTC
svn commit: r1244754 - in
/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs: ./
src/main/java/org/apache/hadoop/hdfs/server/namenode/
src/test/java/org/apache/hadoop/hdfs/server/namenode/
Author: suresh
Date: Wed Feb 15 22:02:16 2012
New Revision: 1244754
URL: http://svn.apache.org/viewvc?rev=1244754&view=rev
Log:
HDFS-2938. Merging change 1244752 from trunk to 0.23
Modified:
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestLargeDirectoryDelete.java
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt?rev=1244754&r1=1244753&r2=1244754&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt Wed Feb 15 22:02:16 2012
@@ -41,6 +41,9 @@ Release 0.23.2 - UNRELEASED
HDFS-2525. Race between BlockPoolSliceScanner and append. (Brandon Li
via jitendra)
+ HDFS-2938. Recursive delete of a large directory make namenode
+ unresponsive. (Hari Mankude via suresh)
+
Release 0.23.1 - 2012-02-08
INCOMPATIBLE CHANGES
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java?rev=1244754&r1=1244753&r2=1244754&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java Wed Feb 15 22:02:16 2012
@@ -1928,15 +1928,8 @@ public class FSNamesystem implements Nam
} finally {
writeUnlock();
}
-
- getEditLog().logSync();
-
- writeLock();
- try {
- removeBlocks(collectedBlocks); // Incremental deletion of blocks
- } finally {
- writeUnlock();
- }
+ getEditLog().logSync();
+ removeBlocks(collectedBlocks); // Incremental deletion of blocks
collectedBlocks.clear();
if (NameNode.stateChangeLog.isDebugEnabled()) {
NameNode.stateChangeLog.debug("DIR* Namesystem.delete: "
@@ -1945,16 +1938,24 @@ public class FSNamesystem implements Nam
return true;
}
- /** From the given list, incrementally remove the blocks from blockManager */
+ /**
+ * From the given list, incrementally remove the blocks from blockManager
+ * Writelock is dropped and reacquired every BLOCK_DELETION_INCREMENT to
+ * ensure that other waiters on the lock can get in. See HDFS-2938
+ */
private void removeBlocks(List<Block> blocks) {
- assert hasWriteLock();
int start = 0;
int end = 0;
while (start < blocks.size()) {
end = BLOCK_DELETION_INCREMENT + start;
end = end > blocks.size() ? blocks.size() : end;
- for (int i=start; i<end; i++) {
- blockManager.removeBlock(blocks.get(i));
+ writeLock();
+ try {
+ for (int i = start; i < end; i++) {
+ blockManager.removeBlock(blocks.get(i));
+ }
+ } finally {
+ writeUnlock();
}
start = end;
}
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestLargeDirectoryDelete.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestLargeDirectoryDelete.java?rev=1244754&r1=1244753&r2=1244754&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestLargeDirectoryDelete.java (original)
+++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestLargeDirectoryDelete.java Wed Feb 15 22:02:16 2012
@@ -117,8 +117,11 @@ public class TestLargeDirectoryDelete {
try {
int blockcount = getBlockCount();
if (blockcount < TOTAL_BLOCKS && blockcount > 0) {
- synchronized(mc.getNamesystem()) {
+ mc.getNamesystem().writeLock();
+ try {
lockOps++;
+ } finally {
+ mc.getNamesystem().writeUnlock();
}
Thread.sleep(1);
}