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

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


The following commit(s) were added to refs/heads/trunk by this push:
     new 7c941e00b45 HDFS-16933. A race in SerialNumberMap will cause wrong 
owner, group and XATTR. (#5430). Contributed by ZanderXu.
7c941e00b45 is described below

commit 7c941e00b45ce1ccc02d7a5d7ec575a04c8bfb1e
Author: ZanderXu <zande...@apache.org>
AuthorDate: Wed Sep 6 10:27:52 2023 +0800

    HDFS-16933. A race in SerialNumberMap will cause wrong owner, group and 
XATTR. (#5430). Contributed by ZanderXu.
    
    Signed-off-by: He Xiaoqiao <hexiaoq...@apache.org>
---
 .../hdfs/server/namenode/SerialNumberMap.java      | 25 +++++++++++++---------
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git 
a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SerialNumberMap.java
 
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SerialNumberMap.java
index ff116b51188..453844ec951 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SerialNumberMap.java
+++ 
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SerialNumberMap.java
@@ -61,17 +61,22 @@ public class SerialNumberMap<T> {
     }
     Integer sn = t2i.get(t);
     if (sn == null) {
-      sn = current.getAndIncrement();
-      if (sn > max) {
-        current.getAndDecrement();
-        throw new IllegalStateException(name + ": serial number map is full");
+      synchronized (this) {
+        sn = t2i.get(t);
+        if (sn == null) {
+          sn = current.getAndIncrement();
+          if (sn > max) {
+            current.getAndDecrement();
+            throw new IllegalStateException(name + ": serial number map is 
full");
+          }
+          Integer old = t2i.putIfAbsent(t, sn);
+          if (old != null) {
+            current.getAndDecrement();
+            return old;
+          }
+          i2t.put(sn, t);
+        }
       }
-      Integer old = t2i.putIfAbsent(t, sn);
-      if (old != null) {
-        current.getAndDecrement();
-        return old;
-      }
-      i2t.put(sn, t);
     }
     return sn;
   }


---------------------------------------------------------------------
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