Author: kihwal Date: Thu Oct 17 20:28:51 2013 New Revision: 1533252 URL: http://svn.apache.org/r1533252 Log: HDFS-5239. Allow FSNamesystem lock fairness to be configurable. Contributed by Daryn Sharp.
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/TestFSNamesystem.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=1533252&r1=1533251&r2=1533252&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 Thu Oct 17 20:28:51 2013 @@ -24,6 +24,9 @@ Release 0.23.10 - UNRELEASED OPTIMIZATIONS + HDFS-5239. Allow FSNamesystem lock fairness to be configurable (daryn via + kihwal) + BUG FIXES HDFS-4984. Incorrect Quota counting in INodeFile. (jing9 via kihwal) 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=1533252&r1=1533251&r2=1533252&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 Thu Oct 17 20:28:51 2013 @@ -350,7 +350,7 @@ public class FSNamesystem implements Nam this.systemStart = now(); this.blockManager = new BlockManager(this, this, conf); this.datanodeStatistics = blockManager.getDatanodeManager().getDatanodeStatistics(); - this.fsLock = new ReentrantReadWriteLock(true); // fair locking + this.fsLock = createFsLock(conf); setConfigurationParameters(conf); // For testing purposes, allow the DT secret manager to be started regardless // of whether security is enabled. @@ -373,6 +373,12 @@ public class FSNamesystem implements Nam this.safeMode = new SafeModeInfo(conf); } + private static ReentrantReadWriteLock createFsLock(Configuration conf) { + boolean fair = conf.getBoolean("dfs.namenode.fslock.fair", true); + LOG.info("fsLock is fair:" + fair); + return new ReentrantReadWriteLock(fair); + } + void activateSecretManager() throws IOException { if (dtSecretManager != null) { dtSecretManager.startThreads(); @@ -472,7 +478,7 @@ public class FSNamesystem implements Nam * is stored */ FSNamesystem(FSImage fsImage, Configuration conf) throws IOException { - this.fsLock = new ReentrantReadWriteLock(true); + this.fsLock = createFsLock(conf); this.blockManager = new BlockManager(this, this, conf); setConfigurationParameters(conf); this.dir = new FSDirectory(fsImage, this, conf); @@ -4548,4 +4554,14 @@ public class FSNamesystem implements Nam public SafeModeInfo getSafeModeInfoForTests() { return safeMode; } + + @VisibleForTesting + void setFsLockForTests(ReentrantReadWriteLock lock) { + this.fsLock = lock; + } + + @VisibleForTesting + ReentrantReadWriteLock getFsLockForTests() { + return fsLock; + } } Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystem.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/TestFSNamesystem.java?rev=1533252&r1=1533251&r2=1533252&view=diff ============================================================================== --- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystem.java (original) +++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystem.java Thu Oct 17 20:28:51 2013 @@ -18,7 +18,7 @@ package org.apache.hadoop.hdfs.server.namenode; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; import java.io.IOException; @@ -72,4 +72,21 @@ public class TestFSNamesystem { assertTrue("Replication queues weren't being populated after entering " + "safemode 2nd time", fsn.isPopulatingReplQueues()); } + + @Test + public void testFsLockFairness() throws IOException, InterruptedException{ + Configuration conf = new Configuration(); + + FSEditLog fsEditLog = Mockito.mock(FSEditLog.class); + FSImage fsImage = Mockito.mock(FSImage.class); + Mockito.when(fsImage.getEditLog()).thenReturn(fsEditLog); + + conf.setBoolean("dfs.namenode.fslock.fair", true); + FSNamesystem fsNamesystem = new FSNamesystem(fsImage, conf); + assertTrue(fsNamesystem.getFsLockForTests().isFair()); + + conf.setBoolean("dfs.namenode.fslock.fair", false); + fsNamesystem = new FSNamesystem(fsImage, conf); + assertFalse(fsNamesystem.getFsLockForTests().isFair()); + } }