瀏覽代碼

HDFS-16933. A race in SerialNumberMap will cause wrong owner, group and XATTR. (#5430). Contributed by ZanderXu.

Signed-off-by: He Xiaoqiao <hexiaoqiao@apache.org>
ZanderXu 1 年之前
父節點
當前提交
7c941e00b4

+ 15 - 10
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;
   }