Author: bobby
Date: Wed Nov 14 22:19:48 2012
New Revision: 1409479
URL: http://svn.apache.org/viewvc?rev=1409479&view=rev
Log:
HDFS-4182. SecondaryNameNode leaks NameCache entries (bobby)
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/FSDirectory.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameCache.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SecondaryNameNode.java
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameCache.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=1409479&r1=1409478&r2=1409479&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 Nov 14 22:19:48 2012
@@ -54,6 +54,8 @@ Release 0.23.5 - UNRELEASED
HDFS-4172. namenode does not URI-encode parameters when building URI for
datanode request (Derek Dagit via bobby)
+ HDFS-4182. SecondaryNameNode leaks NameCache entries (bobby)
+
Release 0.23.4 - UNRELEASED
INCOMPATIBLE CHANGES
Modified:
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.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/FSDirectory.java?rev=1409479&r1=1409478&r2=1409479&view=diff
==============================================================================
---
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java
(original)
+++
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSDirectory.java
Wed Nov 14 22:19:48 2012
@@ -60,6 +60,9 @@ import org.apache.hadoop.hdfs.server.com
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.StartupOption;
import org.apache.hadoop.hdfs.util.ByteArray;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
+
/*************************************************
* FSDirectory stores the filesystem directory state.
* It handles writing/loading values to disk, and logging
@@ -184,6 +187,21 @@ public class FSDirectory implements Clos
fsImage.close();
}
}
+ setReady();
+ }
+
+
+ /**
+ * Notify that loading of this FSDirectory is complete, and
+ * it is ready for use
+ */
+ void imageLoadComplete() {
+ Preconditions.checkState(!ready, "FSDirectory already loaded");
+ setReady();
+ }
+
+ void setReady() {
+ if(ready) return;
writeLock();
try {
setReady(true);
@@ -193,6 +211,12 @@ public class FSDirectory implements Clos
writeUnlock();
}
}
+
+ //This is for testing purposes only
+ @VisibleForTesting
+ boolean isReady() {
+ return ready;
+ }
// exposed for unit tests
protected void setReady(boolean flag) {
@@ -2129,9 +2153,16 @@ public class FSDirectory implements Clos
* Reset the entire namespace tree.
*/
void reset() {
- rootDir = new INodeDirectoryWithQuota(INodeDirectory.ROOT_NAME,
- getFSNamesystem().createFsOwnerPermissions(new
FsPermission((short)0755)),
- Integer.MAX_VALUE, -1);
+ writeLock();
+ try {
+ setReady(false);
+ rootDir = new INodeDirectoryWithQuota(INodeDirectory.ROOT_NAME,
+ getFSNamesystem().createFsOwnerPermissions(new
FsPermission((short)0755)),
+ Integer.MAX_VALUE, -1);
+ nameCache.reset();
+ } finally {
+ writeUnlock();
+ }
}
/**
@@ -2293,4 +2324,5 @@ public class FSDirectory implements Clos
inode.setLocalName(name.getBytes());
}
}
+
}
Modified:
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameCache.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/NameCache.java?rev=1409479&r1=1409478&r2=1409479&view=diff
==============================================================================
---
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameCache.java
(original)
+++
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameCache.java
Wed Nov 14 22:19:48 2012
@@ -152,4 +152,14 @@ class NameCache<K> {
cache.put(name, name);
lookups += useThreshold;
}
+
+ public void reset() {
+ initialized = false;
+ cache.clear();
+ if (transientMap == null) {
+ transientMap = new HashMap<K, UseCount>();
+ } else {
+ transientMap.clear();
+ }
+ }
}
Modified:
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SecondaryNameNode.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/SecondaryNameNode.java?rev=1409479&r1=1409478&r2=1409479&view=diff
==============================================================================
---
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SecondaryNameNode.java
(original)
+++
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SecondaryNameNode.java
Wed Nov 14 22:19:48 2012
@@ -859,6 +859,7 @@ public class SecondaryNameNode implement
"just been downloaded");
}
dstImage.reloadFromImageFile(file);
+ dstImage.getFSNamesystem().dir.imageLoadComplete();
}
Checkpointer.rollForwardByApplyingLogs(manifest, dstImage);
Modified:
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameCache.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/TestNameCache.java?rev=1409479&r1=1409478&r2=1409479&view=diff
==============================================================================
---
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameCache.java
(original)
+++
hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameCache.java
Wed Nov 14 22:19:48 2012
@@ -55,6 +55,17 @@ public class TestNameCache {
for (String s : notMatching) {
verifyNameReuse(cache, s, false);
}
+
+ cache.reset();
+ cache.initialized();
+
+ for (String s : matching) {
+ verifyNameReuse(cache, s, false);
+ }
+
+ for (String s : notMatching) {
+ verifyNameReuse(cache, s, false);
+ }
}
private void verifyNameReuse(NameCache<String> cache, String s, boolean
reused) {