Skip to content

Commit 2c76916

Browse files
committed
HDFS-11345. Document the configuration key for FSNamesystem lock fairness. Contributed by Erik Krogen.
1 parent 15964ef commit 2c76916

File tree

4 files changed

+22
-4
lines changed

4 files changed

+22
-4
lines changed

hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSConfigKeys.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,10 @@ public class DFSConfigKeys extends CommonConfigurationKeys {
423423
public static final long
424424
DFS_NAMENODE_MAX_LOCK_HOLD_TO_RELEASE_LEASE_MS_DEFAULT = 25;
425425

426+
public static final String DFS_NAMENODE_FSLOCK_FAIR_KEY =
427+
"dfs.namenode.fslock.fair";
428+
public static final boolean DFS_NAMENODE_FSLOCK_FAIR_DEFAULT = true;
429+
426430
public static final String DFS_NAMENODE_LOCK_DETAILED_METRICS_KEY =
427431
"dfs.namenode.lock.detailed-metrics.enabled";
428432
public static final boolean DFS_NAMENODE_LOCK_DETAILED_METRICS_DEFAULT =

hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystemLock.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232

3333
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_LOCK_SUPPRESS_WARNING_INTERVAL_DEFAULT;
3434
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_LOCK_SUPPRESS_WARNING_INTERVAL_KEY;
35+
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_FSLOCK_FAIR_DEFAULT;
36+
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_FSLOCK_FAIR_KEY;
3537
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_LOCK_DETAILED_METRICS_DEFAULT;
3638
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_LOCK_DETAILED_METRICS_KEY;
3739
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_READ_LOCK_REPORTING_THRESHOLD_MS_DEFAULT;
@@ -113,7 +115,8 @@ public Long initialValue() {
113115
@VisibleForTesting
114116
FSNamesystemLock(Configuration conf,
115117
MutableRatesWithAggregation detailedHoldTimeMetrics, Timer timer) {
116-
boolean fair = conf.getBoolean("dfs.namenode.fslock.fair", true);
118+
boolean fair = conf.getBoolean(DFS_NAMENODE_FSLOCK_FAIR_KEY,
119+
DFS_NAMENODE_FSLOCK_FAIR_DEFAULT);
117120
FSNamesystem.LOG.info("fsLock is fair: " + fair);
118121
this.coarseLock = new ReentrantReadWriteLock(fair);
119122
this.timer = timer;

hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2759,6 +2759,16 @@
27592759
</description>
27602760
</property>
27612761

2762+
<property>
2763+
<name>dfs.namenode.fslock.fair</name>
2764+
<value>true</value>
2765+
<description>If this is true, the FS Namesystem lock will be used in Fair mode,
2766+
which will help to prevent writer threads from being starved, but can provide
2767+
lower lock throughput. See java.util.concurrent.locks.ReentrantReadWriteLock
2768+
for more information on fair/non-fair locks.
2769+
</description>
2770+
</property>
2771+
27622772
<property>
27632773
<name>dfs.namenode.startup.delay.block.deletion.sec</name>
27642774
<value>0</value>

hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystemLock.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import java.util.regex.Pattern;
4141

4242
import static org.junit.Assert.*;
43+
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_FSLOCK_FAIR_KEY;
4344
import static org.apache.hadoop.test.MetricsAsserts.assertCounter;
4445
import static org.apache.hadoop.test.MetricsAsserts.assertGauge;
4546

@@ -53,11 +54,11 @@ public class TestFSNamesystemLock {
5354
public void testFsLockFairness() throws IOException, InterruptedException{
5455
Configuration conf = new Configuration();
5556

56-
conf.setBoolean("dfs.namenode.fslock.fair", true);
57+
conf.setBoolean(DFS_NAMENODE_FSLOCK_FAIR_KEY, true);
5758
FSNamesystemLock fsnLock = new FSNamesystemLock(conf, null);
5859
assertTrue(fsnLock.coarseLock.isFair());
5960

60-
conf.setBoolean("dfs.namenode.fslock.fair", false);
61+
conf.setBoolean(DFS_NAMENODE_FSLOCK_FAIR_KEY, false);
6162
fsnLock = new FSNamesystemLock(conf, null);
6263
assertFalse(fsnLock.coarseLock.isFair());
6364
}
@@ -103,7 +104,7 @@ public void testFSLockGetWaiterCount() throws InterruptedException {
103104
final int threadCount = 3;
104105
final CountDownLatch latch = new CountDownLatch(threadCount);
105106
final Configuration conf = new Configuration();
106-
conf.setBoolean("dfs.namenode.fslock.fair", true);
107+
conf.setBoolean(DFS_NAMENODE_FSLOCK_FAIR_KEY, true);
107108
final FSNamesystemLock rwLock = new FSNamesystemLock(conf, null);
108109
rwLock.writeLock();
109110
ExecutorService helper = Executors.newFixedThreadPool(threadCount);

0 commit comments

Comments
 (0)