Browse Source

Fix HADOOP-1513, which is a race condition in directory creation. Thanks
Devaraj.


git-svn-id: https://svn.apache.org/repos/asf/lucene/hadoop/trunk@552548 13f79535-47bb-0310-9956-ffa450edef68

Owen O'Malley 18 năm trước cách đây
mục cha
commit
63a10085fa
2 tập tin đã thay đổi với 32 bổ sung1 xóa
  1. 2 0
      CHANGES.txt
  2. 30 1
      src/java/org/apache/hadoop/util/DiskChecker.java

+ 2 - 0
CHANGES.txt

@@ -271,6 +271,8 @@ Trunk (unreleased changes)
  83. HADOOP-1520.  Add appropriate synchronization to FSEditsLog.
      (Dhruba Borthakur via nigel)
 
+ 84. HADOOP-1513.  Fix a race condition in directory creation. 
+     (Devaraj via omalley)
 
 Release 0.13.0 - 2007-06-08
 

+ 30 - 1
src/java/org/apache/hadoop/util/DiskChecker.java

@@ -21,8 +21,37 @@ public class DiskChecker {
     }
   }
       
+  /** 
+   * The semantics of mkdirsWithExistsCheck method is different from the mkdirs
+   * method provided in the Sun's java.io.File class in the following way:
+   * While creating the non-existent parent directories, this method checks for
+   * the existence of those directories if the mkdir fails at any point (since
+   * that directory might have just been created by some other process).
+   * If both mkdir() and the exists() check fails for any seemingly 
+   * non-existent directory, then we signal an error; Sun's mkdir would signal
+   * an error (return false) if a directory it is attempting to create already
+   * exists or the mkdir fails.
+   * @param dir
+   * @return true on success, false on failure
+   */
+  public static boolean mkdirsWithExistsCheck(File dir) {
+    if (dir.mkdir() || dir.exists()) {
+      return true;
+    }
+    File canonDir = null;
+    try {
+      canonDir = dir.getCanonicalFile();
+    } catch (IOException e) {
+      return false;
+    }
+    String parent = canonDir.getParent();
+    return (parent != null) && 
+           (mkdirsWithExistsCheck(new File(parent)) &&
+                                      (canonDir.mkdir() || canonDir.exists()));
+  }
+  
   public static void checkDir(File dir) throws DiskErrorException {
-    if (!dir.exists() && !dir.mkdirs())
+    if (!mkdirsWithExistsCheck(dir))
       throw new DiskErrorException("can not create directory: " 
                                    + dir.toString());