hadoop-common-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From omal...@apache.org
Subject svn commit: r552548 - in /lucene/hadoop/trunk: CHANGES.txt src/java/org/apache/hadoop/util/DiskChecker.java
Date Mon, 02 Jul 2007 17:36:57 GMT
Author: omalley
Date: Mon Jul  2 10:36:56 2007
New Revision: 552548

URL: http://svn.apache.org/viewvc?view=rev&rev=552548
Log:
Fix HADOOP-1513, which is a race condition in directory creation. Thanks 
Devaraj.

Modified:
    lucene/hadoop/trunk/CHANGES.txt
    lucene/hadoop/trunk/src/java/org/apache/hadoop/util/DiskChecker.java

Modified: lucene/hadoop/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/CHANGES.txt?view=diff&rev=552548&r1=552547&r2=552548
==============================================================================
--- lucene/hadoop/trunk/CHANGES.txt (original)
+++ lucene/hadoop/trunk/CHANGES.txt Mon Jul  2 10:36:56 2007
@@ -271,6 +271,8 @@
  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
 

Modified: lucene/hadoop/trunk/src/java/org/apache/hadoop/util/DiskChecker.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/java/org/apache/hadoop/util/DiskChecker.java?view=diff&rev=552548&r1=552547&r2=552548
==============================================================================
--- lucene/hadoop/trunk/src/java/org/apache/hadoop/util/DiskChecker.java (original)
+++ lucene/hadoop/trunk/src/java/org/apache/hadoop/util/DiskChecker.java Mon Jul  2 10:36:56
2007
@@ -21,8 +21,37 @@
     }
   }
       
+  /** 
+   * 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());
         



Mime
View raw message