|
34 | 34 | import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_BLOCK_SIZE_KEY; |
35 | 35 | import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_AUDIT_LOG_WITH_REMOTE_PORT_DEFAULT; |
36 | 36 | import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_AUDIT_LOG_WITH_REMOTE_PORT_KEY; |
| 37 | +import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_LOCK_MODEL_PROVIDER_DEFAULT; |
| 38 | +import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_LOCK_MODEL_PROVIDER_KEY; |
37 | 39 | import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_STORAGE_POLICY_ENABLED_DEFAULT; |
38 | 40 | import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_STORAGE_POLICY_PERMISSIONS_SUPERUSER_ONLY_DEFAULT; |
39 | 41 | import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_STORAGE_POLICY_PERMISSIONS_SUPERUSER_ONLY_KEY; |
|
96 | 98 | import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_SNAPSHOT_DIFF_LISTING_LIMIT_DEFAULT; |
97 | 99 | import static org.apache.hadoop.hdfs.DFSUtil.isParentEntry; |
98 | 100 |
|
| 101 | +import java.lang.reflect.Constructor; |
99 | 102 | import java.nio.charset.StandardCharsets; |
100 | 103 | import java.util.Optional; |
101 | 104 | import java.util.concurrent.atomic.AtomicLong; |
|
115 | 118 | import org.apache.hadoop.hdfs.protocol.ErasureCodingPolicyInfo; |
116 | 119 |
|
117 | 120 | import org.apache.hadoop.hdfs.server.blockmanagement.BlockInfoStriped; |
| 121 | +import org.apache.hadoop.hdfs.server.namenode.fgl.FSNLockManager; |
| 122 | +import org.apache.hadoop.hdfs.server.namenode.fgl.FSNamesystemLockMode; |
118 | 123 | import org.apache.hadoop.thirdparty.com.google.common.collect.Maps; |
119 | 124 | import org.apache.hadoop.hdfs.server.namenode.snapshot.SnapshotDeletionGc; |
120 | 125 | import org.apache.hadoop.thirdparty.protobuf.ByteString; |
@@ -623,7 +628,7 @@ private boolean isFromProxyUser(CallerContext ctx) { |
623 | 628 | private final int numCommittedAllowed; |
624 | 629 |
|
625 | 630 | /** Lock to protect FSNamesystem. */ |
626 | | - private final FSNamesystemLock fsLock; |
| 631 | + private final FSNLockManager fsLock; |
627 | 632 |
|
628 | 633 | /** |
629 | 634 | * Checkpoint lock to protect FSNamesystem modification on standby NNs. |
@@ -873,7 +878,10 @@ static FSNamesystem loadFromDisk(Configuration conf) throws IOException { |
873 | 878 | this.contextFieldSeparator = |
874 | 879 | conf.get(HADOOP_CALLER_CONTEXT_SEPARATOR_KEY, |
875 | 880 | HADOOP_CALLER_CONTEXT_SEPARATOR_DEFAULT); |
876 | | - fsLock = new FSNamesystemLock(conf, detailedLockHoldTimeMetrics); |
| 881 | + Class<? extends FSNLockManager> lockKlass = conf.getClass( |
| 882 | + DFS_NAMENODE_LOCK_MODEL_PROVIDER_KEY, DFS_NAMENODE_LOCK_MODEL_PROVIDER_DEFAULT, |
| 883 | + FSNLockManager.class); |
| 884 | + fsLock = createLock(lockKlass, conf, detailedLockHoldTimeMetrics); |
877 | 885 | cpLock = new ReentrantLock(); |
878 | 886 |
|
879 | 887 | this.fsImage = fsImage; |
@@ -1082,6 +1090,18 @@ static FSNamesystem loadFromDisk(Configuration conf) throws IOException { |
1082 | 1090 | } |
1083 | 1091 | } |
1084 | 1092 |
|
| 1093 | + private <T> T createLock(Class<T> theClass, Configuration conf, |
| 1094 | + MutableRatesWithAggregation mutableRatesMetrics) { |
| 1095 | + try { |
| 1096 | + Constructor<T> meth = theClass.getDeclaredConstructor( |
| 1097 | + Configuration.class, MutableRatesWithAggregation.class); |
| 1098 | + meth.setAccessible(true); |
| 1099 | + return meth.newInstance(conf, mutableRatesMetrics); |
| 1100 | + } catch (Exception e) { |
| 1101 | + throw new RuntimeException(e); |
| 1102 | + } |
| 1103 | + } |
| 1104 | + |
1085 | 1105 | private static void checkForAsyncLogEnabledByOldConfigs(Configuration conf) { |
1086 | 1106 | // dfs.namenode.audit.log.async is no longer in use. Use log4j properties instead. |
1087 | 1107 | if (conf.getBoolean("dfs.namenode.audit.log.async", false)) { |
@@ -1793,70 +1813,74 @@ public static List<URI> getSharedEditsDirs(Configuration conf) { |
1793 | 1813 | } |
1794 | 1814 |
|
1795 | 1815 | @Override |
1796 | | - public void readLock() { |
1797 | | - this.fsLock.readLock(); |
1798 | | - } |
1799 | | - |
1800 | | - @Override |
1801 | | - public void readLockInterruptibly() throws InterruptedException { |
1802 | | - this.fsLock.readLockInterruptibly(); |
| 1816 | + public void readLock(FSNamesystemLockMode lockMode) { |
| 1817 | + this.fsLock.readLock(lockMode); |
1803 | 1818 | } |
1804 | 1819 |
|
1805 | 1820 | @Override |
1806 | | - public void readUnlock() { |
1807 | | - this.fsLock.readUnlock(); |
| 1821 | + public void readLockInterruptibly(FSNamesystemLockMode lockMode) throws InterruptedException { |
| 1822 | + this.fsLock.readLockInterruptibly(lockMode); |
1808 | 1823 | } |
1809 | 1824 |
|
1810 | 1825 | @Override |
1811 | | - public void readUnlock(String opName) { |
1812 | | - this.fsLock.readUnlock(opName); |
| 1826 | + public void readUnlock(FSNamesystemLockMode lockMode, String opName) { |
| 1827 | + this.fsLock.readUnlock(lockMode, opName); |
1813 | 1828 | } |
1814 | 1829 |
|
1815 | 1830 | public void readUnlock(String opName, |
1816 | 1831 | Supplier<String> lockReportInfoSupplier) { |
1817 | | - this.fsLock.readUnlock(opName, lockReportInfoSupplier); |
| 1832 | + readUnlock(FSNamesystemLockMode.GLOBAL, opName, lockReportInfoSupplier); |
1818 | 1833 | } |
1819 | 1834 |
|
1820 | | - @Override |
1821 | | - public void writeLock() { |
1822 | | - this.fsLock.writeLock(); |
| 1835 | + public void readUnlock(FSNamesystemLockMode lockMode, String opName, |
| 1836 | + Supplier<String> lockReportInfoSupplier) { |
| 1837 | + this.fsLock.readUnlock(lockMode, opName, lockReportInfoSupplier); |
1823 | 1838 | } |
1824 | 1839 |
|
1825 | 1840 | @Override |
1826 | | - public void writeLockInterruptibly() throws InterruptedException { |
1827 | | - this.fsLock.writeLockInterruptibly(); |
| 1841 | + public void writeLock(FSNamesystemLockMode lockMode) { |
| 1842 | + this.fsLock.writeLock(lockMode); |
1828 | 1843 | } |
1829 | 1844 |
|
1830 | 1845 | @Override |
1831 | | - public void writeUnlock() { |
1832 | | - this.fsLock.writeUnlock(); |
| 1846 | + public void writeLockInterruptibly(FSNamesystemLockMode lockMode) throws InterruptedException { |
| 1847 | + this.fsLock.writeLockInterruptibly(lockMode); |
1833 | 1848 | } |
1834 | 1849 |
|
1835 | 1850 | @Override |
1836 | | - public void writeUnlock(String opName) { |
1837 | | - this.fsLock.writeUnlock(opName); |
| 1851 | + public void writeUnlock(FSNamesystemLockMode lockMode, String opName) { |
| 1852 | + this.fsLock.writeUnlock(lockMode, opName); |
1838 | 1853 | } |
1839 | 1854 |
|
1840 | 1855 | public void writeUnlock(String opName, boolean suppressWriteLockReport) { |
1841 | | - this.fsLock.writeUnlock(opName, suppressWriteLockReport); |
| 1856 | + writeUnlock(FSNamesystemLockMode.GLOBAL, opName, suppressWriteLockReport); |
| 1857 | + } |
| 1858 | + |
| 1859 | + public void writeUnlock(FSNamesystemLockMode lockMode, String opName, |
| 1860 | + boolean suppressWriteLockReport) { |
| 1861 | + this.fsLock.writeUnlock(lockMode, opName, suppressWriteLockReport); |
| 1862 | + } |
| 1863 | + |
| 1864 | + public void writeUnlock(String opName, Supplier<String> lockReportInfoSupplier) { |
| 1865 | + writeUnlock(FSNamesystemLockMode.GLOBAL, opName, lockReportInfoSupplier); |
1842 | 1866 | } |
1843 | 1867 |
|
1844 | | - public void writeUnlock(String opName, |
| 1868 | + public void writeUnlock(FSNamesystemLockMode lockMode, String opName, |
1845 | 1869 | Supplier<String> lockReportInfoSupplier) { |
1846 | | - this.fsLock.writeUnlock(opName, lockReportInfoSupplier); |
| 1870 | + this.fsLock.writeUnlock(lockMode, opName, lockReportInfoSupplier); |
1847 | 1871 | } |
1848 | 1872 |
|
1849 | 1873 | @Override |
1850 | | - public boolean hasWriteLock() { |
1851 | | - return this.fsLock.isWriteLockedByCurrentThread(); |
| 1874 | + public boolean hasWriteLock(FSNamesystemLockMode lockMode) { |
| 1875 | + return this.fsLock.hasWriteLock(lockMode); |
1852 | 1876 | } |
1853 | 1877 | @Override |
1854 | | - public boolean hasReadLock() { |
1855 | | - return this.fsLock.getReadHoldCount() > 0 || hasWriteLock(); |
| 1878 | + public boolean hasReadLock(FSNamesystemLockMode lockMode) { |
| 1879 | + return this.fsLock.hasReadLock(lockMode); |
1856 | 1880 | } |
1857 | 1881 |
|
1858 | 1882 | public int getReadHoldCount() { |
1859 | | - return this.fsLock.getReadHoldCount(); |
| 1883 | + return this.fsLock.getReadHoldCount(FSNamesystemLockMode.GLOBAL); |
1860 | 1884 | } |
1861 | 1885 |
|
1862 | 1886 | /** Lock the checkpoint lock */ |
@@ -4952,21 +4976,21 @@ public float getReconstructionQueuesInitProgress() { |
4952 | 4976 | @Metric({"LockQueueLength", "Number of threads waiting to " + |
4953 | 4977 | "acquire FSNameSystemLock"}) |
4954 | 4978 | public int getFsLockQueueLength() { |
4955 | | - return fsLock.getQueueLength(); |
| 4979 | + return fsLock.getQueueLength(FSNamesystemLockMode.FS); |
4956 | 4980 | } |
4957 | 4981 |
|
4958 | 4982 | @Metric(value = {"ReadLockLongHoldCount", "The number of time " + |
4959 | 4983 | "the read lock has been held for longer than the threshold"}, |
4960 | 4984 | type = Metric.Type.COUNTER) |
4961 | 4985 | public long getNumOfReadLockLongHold() { |
4962 | | - return fsLock.getNumOfReadLockLongHold(); |
| 4986 | + return fsLock.getNumOfReadLockLongHold(FSNamesystemLockMode.FS); |
4963 | 4987 | } |
4964 | 4988 |
|
4965 | 4989 | @Metric(value = {"WriteLockLongHoldCount", "The number of time " + |
4966 | 4990 | "the write lock has been held for longer than the threshold"}, |
4967 | 4991 | type = Metric.Type.COUNTER) |
4968 | 4992 | public long getNumOfWriteLockLongHold() { |
4969 | | - return fsLock.getNumOfWriteLockLongHold(); |
| 4993 | + return fsLock.getNumOfWriteLockLongHold(FSNamesystemLockMode.FS); |
4970 | 4994 | } |
4971 | 4995 |
|
4972 | 4996 | int getNumberOfDatanodes(DatanodeReportType type) { |
@@ -7129,12 +7153,12 @@ public void setEditLogTailerForTests(EditLogTailer tailer) { |
7129 | 7153 |
|
7130 | 7154 | @VisibleForTesting |
7131 | 7155 | void setFsLockForTests(ReentrantReadWriteLock lock) { |
7132 | | - this.fsLock.coarseLock = lock; |
| 7156 | + this.fsLock.setLockForTests(lock); |
7133 | 7157 | } |
7134 | 7158 |
|
7135 | 7159 | @VisibleForTesting |
7136 | 7160 | public ReentrantReadWriteLock getFsLockForTests() { |
7137 | | - return fsLock.coarseLock; |
| 7161 | + return fsLock.getLockForTests(); |
7138 | 7162 | } |
7139 | 7163 |
|
7140 | 7164 | @VisibleForTesting |
|
0 commit comments