This is an automated email from the ASF dual-hosted git repository.

zanderxu pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/hadoop.git

commit 8ab53982a56e0979da1f30448e24e77a7c5fa624
Author: ZanderXu <zande...@apache.org>
AuthorDate: Sat Dec 28 19:12:32 2024 +0800

    HDFS-17697. [FGL] hasWriteLock and hasReadLock in 
FineGrainedFSNamesystemLock shouldn't throw assert error (#7250)
---
 .../hdfs/server/namenode/fgl/FSNLockManager.java   |  1 +
 .../namenode/fgl/FineGrainedFSNamesystemLock.java  | 26 +++-------------
 .../java/org/apache/hadoop/hdfs/util/RwLock.java   | 36 +++++++++++++++++-----
 3 files changed, 34 insertions(+), 29 deletions(-)

diff --git 
a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/fgl/FSNLockManager.java
 
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/fgl/FSNLockManager.java
index a0452fea88d..0dc5eaa9cc9 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/fgl/FSNLockManager.java
+++ 
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/fgl/FSNLockManager.java
@@ -35,6 +35,7 @@ public interface FSNLockManager {
   /**
    * Acquire read lock according to the lock mode, unless interrupted while 
waiting.
    * @param lockMode locking mode
+   * @throws InterruptedException If the thread is interrupted, an 
InterruptedException is thrown.
    */
   void readLockInterruptibly(RwLockMode lockMode) throws InterruptedException;
 
diff --git 
a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/fgl/FineGrainedFSNamesystemLock.java
 
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/fgl/FineGrainedFSNamesystemLock.java
index 934ac959b4a..f109c0f171e 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/fgl/FineGrainedFSNamesystemLock.java
+++ 
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/fgl/FineGrainedFSNamesystemLock.java
@@ -166,15 +166,8 @@ public void writeLockInterruptibly(RwLockMode lockMode)
   @Override
   public boolean hasWriteLock(RwLockMode lockMode) {
     if (lockMode.equals(RwLockMode.GLOBAL)) {
-      if (this.fsLock.isWriteLockedByCurrentThread()) {
-        // The bm writeLock should be held by the current thread.
-        assert this.bmLock.isWriteLockedByCurrentThread();
-        return true;
-      } else {
-        // The bm writeLock should not be held by the current thread.
-        assert !this.bmLock.isWriteLockedByCurrentThread();
-        return false;
-      }
+      return this.fsLock.isWriteLockedByCurrentThread()
+          && this.bmLock.isWriteLockedByCurrentThread();
     } else if (lockMode.equals(RwLockMode.FS)) {
       return this.fsLock.isWriteLockedByCurrentThread();
     } else if (lockMode.equals(RwLockMode.BM)) {
@@ -186,17 +179,8 @@ public boolean hasWriteLock(RwLockMode lockMode) {
   @Override
   public boolean hasReadLock(RwLockMode lockMode) {
     if (lockMode.equals(RwLockMode.GLOBAL)) {
-      if (hasWriteLock(RwLockMode.GLOBAL)) {
-        return true;
-      } else if (this.fsLock.getReadHoldCount() > 0) {
-        // The bm readLock should be held by the current thread.
-        assert this.bmLock.getReadHoldCount() > 0;
-        return true;
-      } else {
-        // The bm readLock should not be held by the current thread.
-        assert this.bmLock.getReadHoldCount() <= 0;
-        return false;
-      }
+      return hasWriteLock(RwLockMode.GLOBAL) ||
+          (this.fsLock.getReadHoldCount() > 0 && 
this.bmLock.getReadHoldCount() > 0);
     } else if (lockMode.equals(RwLockMode.FS)) {
       return this.fsLock.getReadHoldCount() > 0 || 
this.fsLock.isWriteLockedByCurrentThread();
     } else if (lockMode.equals(RwLockMode.BM)) {
@@ -205,11 +189,11 @@ public boolean hasReadLock(RwLockMode lockMode) {
     return false;
   }
 
-  @Override
   /**
    * This method is only used for ComputeDirectoryContentSummary.
    * For the GLOBAL mode, just return the FSLock's ReadHoldCount.
    */
+  @Override
   public int getReadHoldCount(RwLockMode lockMode) {
     if (lockMode.equals(RwLockMode.GLOBAL)) {
       return this.fsLock.getReadHoldCount();
diff --git 
a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/RwLock.java
 
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/RwLock.java
index 2a5d3251333..26fbc0f1266 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/RwLock.java
+++ 
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/util/RwLock.java
@@ -24,7 +24,9 @@ default void readLock() {
     readLock(RwLockMode.GLOBAL);
   }
 
-  /** Acquire read lock. */
+  /** Acquire read lock.
+   * @param lockMode The lock type for acquiring a read lock
+   */
   void readLock(RwLockMode lockMode);
 
   /** Acquire read lock, unless interrupted while waiting.  */
@@ -32,7 +34,9 @@ default void readLockInterruptibly() throws 
InterruptedException {
     readLockInterruptibly(RwLockMode.GLOBAL);
   }
 
-  /** Acquire read lock, unless interrupted while waiting.  */
+  /** Acquire read lock, unless interrupted while waiting.
+   * @param lockMode The lock type for acquiring a read lock
+   */
   void readLockInterruptibly(RwLockMode lockMode) throws InterruptedException;
 
   /** Release read lock. */
@@ -50,16 +54,22 @@ default void readUnlock(String opName) {
 
   /**
    * Release read lock with operation name.
+   * @param lockMode The lock type for releasing the read lock
    * @param opName Option name.
    */
   void readUnlock(RwLockMode lockMode, String opName);
 
-  /** Check if the current thread holds read lock. */
+  /** Check if the current thread holds read lock.
+   * @return true if the read lock is held by the current thread, else false
+   */
   default boolean hasReadLock() {
     return hasReadLock(RwLockMode.GLOBAL);
   }
 
-  /** Check if the current thread holds read lock. */
+  /** Check if the current thread holds read lock.
+   * @param lockMode The lock type used to check whether a read lock is held
+   * @return true if the read lock is held by the current thread, else false
+   */
   boolean hasReadLock(RwLockMode lockMode);
 
   /** Acquire write lock. */
@@ -67,7 +77,9 @@ default void writeLock() {
     writeLock(RwLockMode.GLOBAL);
   }
 
-  /** Acquire write lock. */
+  /** Acquire write lock.
+   * @param lockMode The lock type for acquiring a write lock
+   */
   void writeLock(RwLockMode lockMode);
   
   /** Acquire write lock, unless interrupted while waiting.  */
@@ -75,7 +87,9 @@ default void writeLockInterruptibly() throws 
InterruptedException {
     writeLockInterruptibly(RwLockMode.GLOBAL);
   }
 
-  /** Acquire write lock, unless interrupted while waiting.  */
+  /** Acquire write lock, unless interrupted while waiting.
+   * @param lockMode The lock type for acquiring a write lock
+   */
   void writeLockInterruptibly(RwLockMode lockMode) throws InterruptedException;
 
   /** Release write lock. */
@@ -93,15 +107,21 @@ default void writeUnlock(String opName) {
 
   /**
    * Release write lock with operation name.
+   * @param lockMode The lock type for releasing the write lock
    * @param opName Option name.
    */
   void writeUnlock(RwLockMode lockMode, String opName);
 
-  /** Check if the current thread holds write lock. */
+  /** Check if the current thread holds write lock.
+   * @return true if the write lock is held by the current thread, else false
+   */
   default boolean hasWriteLock() {
     return hasWriteLock(RwLockMode.GLOBAL);
   }
 
-  /** Check if the current thread holds write lock. */
+  /** Check if the current thread holds write lock.
+   * @param lockMode The lock type used to check whether a write lock is held
+   * @return true if the write lock is held by the current thread, else false.
+   */
   boolean hasWriteLock(RwLockMode lockMode);
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org
For additional commands, e-mail: common-commits-h...@hadoop.apache.org

Reply via email to