hadoop-common-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From sur...@apache.org
Subject svn commit: r816818 - in /hadoop/common/trunk: ./ src/java/org/apache/hadoop/fs/ src/test/core/org/apache/hadoop/fs/
Date Sat, 19 Sep 2009 00:03:04 GMT
Author: suresh
Date: Sat Sep 19 00:03:04 2009
New Revision: 816818

URL: http://svn.apache.org/viewvc?rev=816818&view=rev
Log:
HADOOP-6271. Add recursive and non recursive create and mkdir to FileContext. Contributed
by Sanjay Radia.

Added:
    hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextCreateMkdirBaseTest.java
    hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/TestLocalFSFileContextCreateMkdir.java
Modified:
    hadoop/common/trunk/CHANGES.txt
    hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileContext.java
    hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileSystem.java
    hadoop/common/trunk/src/java/org/apache/hadoop/fs/Options.java
    hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextMainOperationsBaseTest.java
    hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/TestFileContextDeleteOnExit.java

Modified: hadoop/common/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/CHANGES.txt?rev=816818&r1=816817&r2=816818&view=diff
==============================================================================
--- hadoop/common/trunk/CHANGES.txt (original)
+++ hadoop/common/trunk/CHANGES.txt Sat Sep 19 00:03:04 2009
@@ -595,6 +595,9 @@
     HADOOP-6166. Further improve the performance of the pure-Java CRC32
     implementation. (Tsz Wo (Nicholas), SZE via cdouglas)
 
+    HADOOP-6271. Add recursive and non recursive create and mkdir to 
+    FileContext. (Sanjay Radia via suresh)
+
   BUG FIXES
     
     HADOOP-5379. CBZip2InputStream to throw IOException on data crc error.

Modified: hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileContext.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileContext.java?rev=816818&r1=816817&r2=816818&view=diff
==============================================================================
--- hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileContext.java (original)
+++ hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileContext.java Sat Sep 19 00:03:04
2009
@@ -467,6 +467,9 @@
    *     Permission - umask is applied against permisssion:
    *                  default FsPermissions:getDefault()
    *                  @see #setPermission(Path, FsPermission)
+   *     CreateParent - create missing parent path
+   *                  default is to not create parents
+   *     
    *                The defaults for the following are  SS defaults of the
    *                file server implementing the tart path.
    *                Not all parameters make sense for all kinds of filesystem
@@ -475,9 +478,11 @@
    *    Blocksize - block size for file blocks
    *    ReplicationFactor - replication for blocks
    *    BytesPerChecksum - bytes per checksum
+   *                     
    *    
    * @throws IOException
    */
+  @SuppressWarnings("deprecation") // call to primitiveCreate
   public FSDataOutputStream create(final Path f,
                                     final EnumSet<CreateFlag> createFlag,
                                     CreateOpts... opts)
@@ -485,99 +490,57 @@
     Path absF = fixRelativePart(f);
     FileSystem fsOfAbsF = getFSofPath(absF);
 
-    int bufferSize = -1;
-    short replication = -1;
-    long blockSize = -1;
-    int bytesPerChecksum = -1;
+    // If one of the options is a permission, extract it & apply umask
+    // If not, add a default Perms and apply umask;
+    // FileSystem#create
+
     FsPermission permission = null;
-    Progressable progress = null;
- 
-    for (CreateOpts iOpt : opts) {
-      if (CreateOpts.BlockSize.class.isInstance(iOpt)) {
-        if (blockSize != -1) {
-          throw new IllegalArgumentException("multiple varargs of same kind");
-        }
-        blockSize = ((CreateOpts.BlockSize) iOpt).getValue();
-      } else if (CreateOpts.BufferSize.class.isInstance(iOpt)) {
-        if (bufferSize != -1) {
-          throw new IllegalArgumentException("multiple varargs of same kind");
-        }
-        bufferSize = ((CreateOpts.BufferSize) iOpt).getValue();
-      } else if (CreateOpts.ReplicationFactor.class.isInstance(iOpt)) {
-        if (replication != -1) {
-          throw new IllegalArgumentException("multiple varargs of same kind");
-        }
-        replication = ((CreateOpts.ReplicationFactor) iOpt).getValue();
-      } else if (CreateOpts.BytesPerChecksum.class.isInstance(iOpt)) {
-        if (bytesPerChecksum != -1) {
-          throw new IllegalArgumentException("multiple varargs of same kind");
-        }
-        bytesPerChecksum = ((CreateOpts.BytesPerChecksum) iOpt).getValue();
-      } else if (CreateOpts.Perms.class.isInstance(iOpt)) {
-        if (permission != null) {
-          throw new IllegalArgumentException("multiple varargs of same kind");
-        }
-        permission = ((CreateOpts.Perms) iOpt).getValue();
-      } else if (CreateOpts.Progress.class.isInstance(iOpt)) {
-        if (progress != null) {
-          throw new IllegalArgumentException("multiple varargs of same kind");
+
+    if (opts != null) {
+      for (int i = 0; i < opts.length; ++i) {
+        if (opts[i] instanceof CreateOpts.Perms) {
+          if (permission != null) 
+            throw new IllegalArgumentException("multiple permissions varargs");
+          permission = ((CreateOpts.Perms) opts[i]).getValue();
+          opts[i] = CreateOpts.perms(permission.applyUMask(umask));
         }
-        progress = ((CreateOpts.Progress) iOpt).getValue();
-      } else {
-        throw new IllegalArgumentException("Unkown CreateOpts of type " +
-            iOpt.getClass().getName());
       }
     }
-    if (blockSize % bytesPerChecksum != 0) {
-      throw new IllegalArgumentException(
-          "blockSize should be a multiple of checksumsize");
-    }
-    
-    FsServerDefaults ssDef = fsOfAbsF.getServerDefaults();
-    
-    if (blockSize == -1) {
-      blockSize = ssDef.getBlockSize();
-    }
-    if (bufferSize == -1) {
-      bufferSize = ssDef.getFileBufferSize();
-    }
-    if (replication == -1) {
-      replication = ssDef.getReplication();
-    }
-    if (bytesPerChecksum == -1) {
-      bytesPerChecksum = ssDef.getBytesPerChecksum();
-    }
-    if (permission == null) {
-      permission = FsPermission.getDefault();
-    }
 
-    FsPermission absPerms = (permission == null ? 
-        FsPermission.getDefault() : permission).applyUMask(umask);
-
-    return fsOfAbsF.primitiveCreate(absF, absPerms, createFlag,
-                bufferSize, replication, blockSize, progress, bytesPerChecksum);
+    CreateOpts[] theOpts = opts;
+    if (permission == null) { // no permission was set
+      CreateOpts[] newOpts = new CreateOpts[opts.length + 1];
+      System.arraycopy(opts, 0, newOpts, 0, opts.length);
+      newOpts[opts.length] = 
+        CreateOpts.perms(FsPermission.getDefault().applyUMask(umask));
+      theOpts = newOpts;
+    }
+    return fsOfAbsF.primitiveCreate(absF, createFlag, theOpts);
   }
   
   /**
    * Make the given file and all non-existent parents into
-   * directories. Has the semantics of Unix 'mkdir -p'.
-   * Existence of the directory hierarchy is not an error.
+   * directories.
    * 
    * @param dir - the dir to make
    * @param permission - permissions is set permission&~umask
-   * @return true if the operation succeeds; false if dir already exists 
-   * @throws IOException when operation fails (e.g. permissions) etc.
-   */
-  public boolean mkdirs(final Path dir, final FsPermission permission)
+   * @param createParent - if true then missing parent dirs are created
+   *                       if false then parent must exist
+   * @throws IOException when operation fails not authorized or 
+   *   if parent does not exist and createParent is false.
+   */
+  @SuppressWarnings("deprecation") // call to primitiveMkdir
+  public void mkdir(final Path dir, final FsPermission permission,
+      final boolean createParent)
     throws IOException {
     Path absDir = fixRelativePart(dir);
     FsPermission absFerms = (permission == null ? 
           FsPermission.getDefault() : permission).applyUMask(umask);
-    return getFSofPath(absDir).primitiveMkdir(absDir, absFerms);
+    getFSofPath(absDir).primitiveMkdir(absDir, absFerms, createParent);
   }
 
-  /** Delete a file.
-   *
+  /**
+   * Delete a file.
    * @param f the path to delete.
    * @param recursive if path is a directory and set to 
    * true, the directory is deleted else throws an exception. In
@@ -1196,10 +1159,8 @@
       checkDest(qSrc.getName(), qDst, false);
       if (isDirectory(qSrc)) {
         checkDependencies(qSrc, qDst);
-        if (!mkdirs(qDst, FsPermission.getDefault())) {
-          throw new IOException("Failed to create destination directory `" +
-              qDst + "'");
-        }
+        mkdir(qDst, FsPermission.getDefault(), true);
+
         FileStatus[] contents = FileContext.this.listStatus(qSrc);
         for (FileStatus content : contents) {
           copy(content.getPath(), new Path(qDst, content.getPath()),

Modified: hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileSystem.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileSystem.java?rev=816818&r1=816817&r2=816818&view=diff
==============================================================================
--- hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileSystem.java (original)
+++ hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileSystem.java Sat Sep 19 00:03:04
2009
@@ -41,6 +41,7 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.conf.Configured;
+import org.apache.hadoop.fs.Options.CreateOpts;
 import org.apache.hadoop.fs.Options.Rename;
 import org.apache.hadoop.fs.permission.FsPermission;
 import org.apache.hadoop.io.MultipleIOException;
@@ -589,10 +590,9 @@
       EnumSet<CreateFlag> flag, int bufferSize, short replication, long blockSize,
       Progressable progress) throws IOException ;
   
-  /*
-   * This version of the create method assumes that the permission 
-   * of create does not matter.
-   * It has been added to support the FileContext that processes the permission
+  /*.
+   * This create has been added to support the FileContext that processes
+   * the permission
    * with umask before calling this method.
    * This a temporary method added to support the transition from FileSystem
    * to FileContext for user applications.
@@ -612,10 +612,115 @@
         blockSize, progress);
   }
   
+  
+  /*.
+   * This create has been added to support the FileContext that passes
+   * an absolute permission with (ie umask was already applied) 
+   * This a temporary method added to support the transition from FileSystem
+   * to FileContext for user applications.
+   */
+  @Deprecated
+  protected FSDataOutputStream primitiveCreate(final Path f,
+      final EnumSet<CreateFlag> createFlag,
+      CreateOpts... opts) throws IOException {
+    checkPath(f);
+    int bufferSize = -1;
+    short replication = -1;
+    long blockSize = -1;
+    int bytesPerChecksum = -1;
+    FsPermission permission = null;
+    Progressable progress = null;
+    Boolean createParent = null;
+ 
+    for (CreateOpts iOpt : opts) {
+      if (CreateOpts.BlockSize.class.isInstance(iOpt)) {
+        if (blockSize != -1) {
+          throw new IllegalArgumentException("multiple varargs of same kind");
+        }
+        blockSize = ((CreateOpts.BlockSize) iOpt).getValue();
+      } else if (CreateOpts.BufferSize.class.isInstance(iOpt)) {
+        if (bufferSize != -1) {
+          throw new IllegalArgumentException("multiple varargs of same kind");
+        }
+        bufferSize = ((CreateOpts.BufferSize) iOpt).getValue();
+      } else if (CreateOpts.ReplicationFactor.class.isInstance(iOpt)) {
+        if (replication != -1) {
+          throw new IllegalArgumentException("multiple varargs of same kind");
+        }
+        replication = ((CreateOpts.ReplicationFactor) iOpt).getValue();
+      } else if (CreateOpts.BytesPerChecksum.class.isInstance(iOpt)) {
+        if (bytesPerChecksum != -1) {
+          throw new IllegalArgumentException("multiple varargs of same kind");
+        }
+        bytesPerChecksum = ((CreateOpts.BytesPerChecksum) iOpt).getValue();
+      } else if (CreateOpts.Perms.class.isInstance(iOpt)) {
+        if (permission != null) {
+          throw new IllegalArgumentException("multiple varargs of same kind");
+        }
+        permission = ((CreateOpts.Perms) iOpt).getValue();
+      } else if (CreateOpts.Progress.class.isInstance(iOpt)) {
+        if (progress != null) {
+          throw new IllegalArgumentException("multiple varargs of same kind");
+        }
+        progress = ((CreateOpts.Progress) iOpt).getValue();
+      } else if (CreateOpts.CreateParent.class.isInstance(iOpt)) {
+        if (createParent != null) {
+          throw new IllegalArgumentException("multiple varargs of same kind");
+        }
+        createParent = ((CreateOpts.CreateParent) iOpt).getValue();
+      } else {
+        throw new IllegalArgumentException("Unkown CreateOpts of type " +
+            iOpt.getClass().getName());
+      }
+    }
+    if (blockSize % bytesPerChecksum != 0) {
+      throw new IllegalArgumentException(
+          "blockSize should be a multiple of checksumsize");
+    }
+    
+    FsServerDefaults ssDef = getServerDefaults();
+    
+    if (blockSize == -1) {
+      blockSize = ssDef.getBlockSize();
+    }
+    if (bufferSize == -1) {
+      bufferSize = ssDef.getFileBufferSize();
+    }
+    if (replication == -1) {
+      replication = ssDef.getReplication();
+    }
+    if (permission == null) {
+      permission = FsPermission.getDefault();
+    }
+    if (createParent == null) {
+      createParent = false;
+    }
+    
+    // Default impl  assumes that permissions do not matter and 
+    // nor does the bytesPerChecksum  hence
+    // calling the regular create is good enough.
+    // FSs that implement permissions should override this.
+
+    if (!createParent) { // parent must exist.
+      // since this.create makes parent dirs automatically
+      // we must throw exception if parent does not exist.
+      final FileStatus stat = getFileStatus(f.getParent());
+      if (stat == null) {
+        throw new FileNotFoundException("Missing parent:" + f);
+      }
+      if (!stat.isDir()) {
+          throw new ParentNotDirectoryException("parent is not a dir:" + f);
+      }
+      // parent does exist - go ahead with create of file.
+    }
+    return this.create(f, permission, createFlag, bufferSize, replication,
+        blockSize, progress);
+  }
+  
 
   /**
-   * This version of the mkdirs method assumes that the permission.
-   * It has been added to support the FileContext that processes the the permission
+   * This version of the mkdirs method assumes that the permission is absolute.
+   * It has been added to support the FileContext that processes the permission
    * with umask before calling this method.
    * This a temporary method added to support the transition from FileSystem
    * to FileContext for user applications.
@@ -631,6 +736,39 @@
 
 
   /**
+   * This version of the mkdirs method assumes that the permission is absolute.
+   * It has been added to support the FileContext that processes the permission
+   * with umask before calling this method.
+   * This a temporary method added to support the transition from FileSystem
+   * to FileContext for user applications.
+   */
+  @Deprecated
+  protected void primitiveMkdir(Path f, FsPermission absolutePermission, 
+                    boolean createParent)
+    throws IOException {
+    
+    if (!createParent) { // parent must exist.
+      // since the this.mkdirs makes parent dirs automatically
+      // we must throw exception if parent does not exist.
+      final FileStatus stat = getFileStatus(f.getParent());
+      if (stat == null) {
+        throw new FileNotFoundException("Missing parent:" + f);
+      }
+      if (!stat.isDir()) {
+          throw new ParentNotDirectoryException("parent is not a dir");
+      }
+      // parent does exist - go ahead with mkdir of leaf
+    }
+    // Default impl is to assume that permissions do not matter and hence
+    // calling the regular mkdirs is good enough.
+    // FSs that implement permissions should override this.
+    if (!this.mkdirs(f, absolutePermission)) {
+      throw new IOException("mkdir of "+ f + " failed");
+    }
+  }
+
+
+  /**
    * Creates the given Path as a brand-new zero-length file.  If
    * create fails, or if it already existed, return false.
    */

Modified: hadoop/common/trunk/src/java/org/apache/hadoop/fs/Options.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/src/java/org/apache/hadoop/fs/Options.java?rev=816818&r1=816817&r2=816818&view=diff
==============================================================================
--- hadoop/common/trunk/src/java/org/apache/hadoop/fs/Options.java (original)
+++ hadoop/common/trunk/src/java/org/apache/hadoop/fs/Options.java Sat Sep 19 00:03:04 2009
@@ -23,7 +23,7 @@
 /**
  * This class contains options related to file system operations.
  */
-public class Options {
+public final class Options {
   /**
    * Class to support the varargs for create() options.
    *
@@ -45,6 +45,12 @@
     public static Perms perms(FsPermission perm) {
       return new Perms(perm);
     }
+    public static CreateParent createParent() {
+      return new CreateParent(true);
+    }
+    public static CreateParent donotCreateParent() {
+      return new CreateParent(false);
+    }
     
     static class BlockSize extends CreateOpts {
       private final long blockSize;
@@ -115,6 +121,13 @@
       }
       Progressable getValue() { return progress; }
     }
+    
+    static class CreateParent extends CreateOpts {
+      private final Boolean createParent;
+      protected CreateParent(boolean createPar) {
+        createParent = createPar;}
+      Boolean getValue() { return createParent; }
+    }
   }
 
   /**

Added: hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextCreateMkdirBaseTest.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextCreateMkdirBaseTest.java?rev=816818&view=auto
==============================================================================
--- hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextCreateMkdirBaseTest.java
(added)
+++ hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextCreateMkdirBaseTest.java
Sat Sep 19 00:03:04 2009
@@ -0,0 +1,189 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.fs;
+
+
+import java.io.IOException;
+import java.util.EnumSet;
+
+import org.apache.hadoop.fs.Options.CreateOpts;
+import org.apache.hadoop.util.StringUtils;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * <p>
+ * A collection of tests for the {@link FileContext}, create method
+ * This test should be used for testing an instance of FileContext
+ *  that has been initialized to a specific default FileSystem such a
+ *  LocalFileSystem, HDFS,S3, etc.
+ * </p>
+ * <p>
+ * To test a given {@link FileSystem} implementation create a subclass of this
+ * test and override {@link #setUp()} to initialize the <code>fc</code> 
+ * {@link FileContext} instance variable.
+ * 
+ * Since this a junit 4 you can also do a single setup before 
+ * the start of any tests.
+ * E.g.
+ *     @BeforeClass   public static void clusterSetupAtBegining()
+ *     @AfterClass    public static void ClusterShutdownAtEnd()
+ * </p>
+ */
+
+public class FileContextCreateMkdirBaseTest {
+   
+  protected static FileContext fc;
+  static final String TEST_ROOT_DIR = new Path(System.getProperty(
+      "test.build.data", "/tmp")).toString().replace(' ', '_')
+      + "/test";
+  
+  protected Path getTestRootRelativePath(String pathString) {
+    return fc.makeQualified(new Path(TEST_ROOT_DIR, pathString));
+  }
+  
+  private Path rootPath = null;
+  protected Path getTestRoot() {
+    if (rootPath == null) {
+      rootPath = fc.makeQualified(new Path(TEST_ROOT_DIR));
+    }
+    return rootPath;   
+  }
+
+
+  {
+    try {
+      ((org.apache.commons.logging.impl.Log4JLogger)FileSystem.LOG).getLogger()
+      .setLevel(org.apache.log4j.Level.DEBUG);
+    }
+    catch(Exception e) {
+      System.out.println("Cannot change log level\n"
+          + StringUtils.stringifyException(e));
+    }
+  }
+  
+
+
+  @Before
+  public void setUp() throws Exception {
+    fc.mkdir(getTestRoot(), FileContext.DEFAULT_PERM, true);
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    fc.delete(getTestRoot(), true);
+  }
+  
+  
+  
+  ///////////////////////
+  //      Test Mkdir
+  ////////////////////////
+  
+  @Test
+  public void testMkdirNonRecursiveWithExistingDir() throws IOException {
+    Path f = getTestRootRelativePath("aDir");
+    fc.mkdir(f, FileContext.DEFAULT_PERM, false);
+    Assert.assertTrue(fc.isDirectory(f));
+  }
+  
+  @Test
+  public void testMkdirNonRecursiveWithNonExistingDir() {
+    try {
+      fc.mkdir(getTestRootRelativePath("NonExistant/aDir"),
+          FileContext.DEFAULT_PERM, false);
+      Assert.fail("Mkdir with non existing parent dir should have failed");
+    } catch (IOException e) {
+      // failed As expected
+    }
+  }
+  
+  
+  @Test
+  public void testMkdirRecursiveWithExistingDir() throws IOException {
+    Path f = getTestRootRelativePath("aDir");
+    fc.mkdir(f, FileContext.DEFAULT_PERM, true);
+    Assert.assertTrue(fc.isDirectory(f));
+  }
+  
+  
+  @Test
+  public void testMkdirRecursiveWithNonExistingDir() throws IOException {
+    Path f = getTestRootRelativePath("NonExistant2/aDir");
+    fc.mkdir(f, FileContext.DEFAULT_PERM, true);
+    Assert.assertTrue(fc.isDirectory(f));
+  }
+ 
+  ///////////////////////
+  //      Test Create
+  ////////////////////////
+  @Test
+  public void testCreateNonRecursiveWithExistingDir() throws IOException {
+    Path f = getTestRootRelativePath("foo");
+    createFile(f);
+    Assert.assertTrue(fc.isFile(f));
+  }
+  
+  @Test
+  public void testCreateNonRecursiveWithNonExistingDir() {
+    try {
+      createFile(getTestRootRelativePath("NonExisting/foo"));
+      Assert.fail("Create with non existing parent dir should have failed");
+    } catch (IOException e) {
+      // As expected
+    }
+  }
+  
+  
+  @Test
+  public void testCreateRecursiveWithExistingDir() throws IOException {
+    Path f = getTestRootRelativePath("foo");
+    createFile(f, CreateOpts.createParent());
+    Assert.assertTrue(fc.isFile(f));
+  }
+  
+  
+  @Test
+  public void testCreateRecursiveWithNonExistingDir() throws IOException {
+    Path f = getTestRootRelativePath("NonExisting/foo");
+    createFile(f, CreateOpts.createParent());
+    Assert.assertTrue(fc.isFile(f));
+  }
+  
+  
+  protected static int getBlockSize() {
+    return 1024;
+  }
+  
+  private static byte[] data = new byte[getBlockSize() * 2]; // two blocks of data
+  {
+    for (int i = 0; i < data.length; i++) {
+      data[i] = (byte) (i % 10);
+    }
+  }
+
+  protected void createFile(Path path, 
+      CreateOpts.CreateParent ... opt) throws IOException {
+    
+    FSDataOutputStream out = fc.create(path,EnumSet.of(CreateFlag.CREATE), opt);
+    out.write(data, 0, data.length);
+    out.close();
+  }
+}

Modified: hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextMainOperationsBaseTest.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextMainOperationsBaseTest.java?rev=816818&r1=816817&r2=816818&view=diff
==============================================================================
--- hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextMainOperationsBaseTest.java
(original)
+++ hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/FileContextMainOperationsBaseTest.java
Sat Sep 19 00:03:04 2009
@@ -70,7 +70,7 @@
   
   @Before
   public void setUp() throws Exception {
-    fc.mkdirs(getTestRootPath("test"), FileContext.DEFAULT_PERM);
+    fc.mkdir(getTestRootPath("test"), FileContext.DEFAULT_PERM, true);
   }
   
   @After
@@ -121,13 +121,13 @@
     // cd using a relative path
     Path relativeDir = new Path("existingDir1");
     Path absoluteDir = new Path(workDir.getParent(),"existingDir1");
-    fc.mkdirs(absoluteDir, FileContext.DEFAULT_PERM);
+    fc.mkdir(absoluteDir, FileContext.DEFAULT_PERM, true);
     fc.setWorkingDirectory(relativeDir);
     Assert.assertEquals(absoluteDir,
                                         fc.getWorkingDirectory());
     // cd using a absolute path
     absoluteDir = getTestRootPath("test/existingDir2");
-    fc.mkdirs(absoluteDir, FileContext.DEFAULT_PERM);
+    fc.mkdir(absoluteDir, FileContext.DEFAULT_PERM, true);
     fc.setWorkingDirectory(absoluteDir);
     Assert.assertEquals(absoluteDir, fc.getWorkingDirectory());
     
@@ -146,7 +146,7 @@
     
     // Try a URI
     absoluteDir = new Path("file:///tmp/existingDir");
-    fc.mkdirs(absoluteDir, FileContext.DEFAULT_PERM);
+    fc.mkdir(absoluteDir, FileContext.DEFAULT_PERM, true);
     fc.setWorkingDirectory(absoluteDir);
     Assert.assertEquals(absoluteDir, fc.getWorkingDirectory());
 
@@ -158,12 +158,12 @@
     Assert.assertFalse(fc.exists(testDir));
     Assert.assertFalse(fc.isFile(testDir));
 
-    Assert.assertTrue(fc.mkdirs(testDir, FsPermission.getDefault()));
+    fc.mkdir(testDir, FsPermission.getDefault(), true);
 
     Assert.assertTrue(fc.exists(testDir));
     Assert.assertFalse(fc.isFile(testDir));
     
-    Assert.assertTrue(fc.mkdirs(testDir, FsPermission.getDefault()));
+    fc.mkdir(testDir, FsPermission.getDefault(), true);
 
     Assert.assertTrue(fc.exists(testDir));
     Assert.assertFalse(fc.isFile(testDir));
@@ -182,14 +182,14 @@
   public void testMkdirsFailsForSubdirectoryOfExistingFile() throws Exception {
     Path testDir = getTestRootPath("test/hadoop");
     Assert.assertFalse(fc.exists(testDir));
-    Assert.assertTrue(fc.mkdirs(testDir, FsPermission.getDefault()));
+    fc.mkdir(testDir, FsPermission.getDefault(), true);
     Assert.assertTrue(fc.exists(testDir));
     
     createFile(getTestRootPath("test/hadoop/file"));
     
     Path testSubDir = getTestRootPath("test/hadoop/file/subdir");
     try {
-      fc.mkdirs(testSubDir, FsPermission.getDefault());
+      fc.mkdir(testSubDir, FsPermission.getDefault(), true);
       Assert.fail("Should throw IOException.");
     } catch (IOException e) {
       // expected
@@ -198,7 +198,7 @@
     
     Path testDeepSubDir = getTestRootPath("test/hadoop/file/deep/sub/dir");
     try {
-      fc.mkdirs(testDeepSubDir, FsPermission.getDefault());
+      fc.mkdir(testDeepSubDir, FsPermission.getDefault(), true);
       Assert.fail("Should throw IOException.");
     } catch (IOException e) {
       // expected
@@ -236,7 +236,7 @@
     Assert.assertFalse(fc.exists(testDirs[0]));
 
     for (Path path : testDirs) {
-      Assert.assertTrue(fc.mkdirs(path, FsPermission.getDefault()));
+      fc.mkdir(path, FsPermission.getDefault(), true);
     }
 
     FileStatus[] paths = fc.listStatus(getTestRootPath("test"));
@@ -290,7 +290,7 @@
   private void writeReadAndDelete(int len) throws IOException {
     Path path = getTestRootPath("test/hadoop/file");
     
-    fc.mkdirs(path.getParent(), FsPermission.getDefault());
+    fc.mkdir(path.getParent(), FsPermission.getDefault(), true);
 
     FSDataOutputStream out = fc.create(path, EnumSet.of(CreateFlag.CREATE), 
         CreateOpts.repFac((short) 1), CreateOpts.blockSize(getBlockSize()));
@@ -320,7 +320,7 @@
   public void testOverwrite() throws IOException {
     Path path = getTestRootPath("test/hadoop/file");
     
-    fc.mkdirs(path.getParent(), FsPermission.getDefault());
+    fc.mkdir(path.getParent(), FsPermission.getDefault(), true);
 
     createFile(path);
     
@@ -368,7 +368,7 @@
     Path subdir = getTestRootPath("test/hadoop/subdir");
     
     createFile(file);
-    Assert.assertTrue("Created subdir", fc.mkdirs(subdir, FsPermission.getDefault()));
+    fc.mkdir(subdir,FsPermission.getDefault(), true);
     
     Assert.assertTrue("File exists", fc.exists(file));
     Assert.assertTrue("Dir exists", fc.exists(dir));
@@ -393,7 +393,7 @@
   @Test
   public void testDeleteEmptyDirectory() throws IOException {
     Path dir = getTestRootPath("test/hadoop");
-    Assert.assertTrue(fc.mkdirs(dir, FsPermission.getDefault()));
+    fc.mkdir(dir, FsPermission.getDefault(), true);
     Assert.assertTrue("Dir exists", fc.exists(dir));
     Assert.assertTrue("Deleted", fc.delete(dir, false));
     Assert.assertFalse("Dir doesn't exist", fc.exists(dir));
@@ -471,7 +471,7 @@
     Path src = getTestRootPath("test/hadoop/file");
     createFile(src);
     Path dst = getTestRootPath("test/new/newfile");
-    fc.mkdirs(dst.getParent(), FileContext.DEFAULT_PERM);
+    fc.mkdir(dst.getParent(), FileContext.DEFAULT_PERM, true);
     rename(src, dst, true, false, true, Rename.OVERWRITE);
   }
 
@@ -503,7 +503,7 @@
     Path src = getTestRootPath("test/hadoop/file");
     createFile(src);
     Path dst = getTestRootPath("test/new/existingDir");
-    fc.mkdirs(dst, FileContext.DEFAULT_PERM);
+    fc.mkdir(dst, FileContext.DEFAULT_PERM, true);
     
     // Fails without overwrite option
     try {
@@ -525,7 +525,7 @@
     if (!renameSupported()) return;
     
     Path src = getTestRootPath("test/hadoop/dir");
-    fc.mkdirs(src, FileContext.DEFAULT_PERM);
+    fc.mkdir(src, FileContext.DEFAULT_PERM, true);
     Path dst = getTestRootPath("test/nonExistent/newdir");
     
     try {
@@ -554,12 +554,12 @@
     if (!renameSupported()) return;
     
     Path src = getTestRootPath("test/hadoop/dir");
-    fc.mkdirs(src, FileContext.DEFAULT_PERM);
+    fc.mkdir(src, FileContext.DEFAULT_PERM, true);
     createFile(getTestRootPath("test/hadoop/dir/file1"));
     createFile(getTestRootPath("test/hadoop/dir/subdir/file2"));
     
     Path dst = getTestRootPath("test/new/newdir");
-    fc.mkdirs(dst.getParent(), FileContext.DEFAULT_PERM);
+    fc.mkdir(dst.getParent(), FileContext.DEFAULT_PERM, true);
     
     rename(src, dst, true, false, true, options);
     Assert.assertFalse("Nested file1 exists",
@@ -577,12 +577,12 @@
     if (!renameSupported()) return;
     
     Path src = getTestRootPath("test/hadoop/dir");
-    fc.mkdirs(src, FileContext.DEFAULT_PERM);
+    fc.mkdir(src, FileContext.DEFAULT_PERM, true);
     createFile(getTestRootPath("test/hadoop/dir/file1"));
     createFile(getTestRootPath("test/hadoop/dir/subdir/file2"));
     
     Path dst = getTestRootPath("test/new/newdir");
-    fc.mkdirs(dst, FileContext.DEFAULT_PERM);
+    fc.mkdir(dst, FileContext.DEFAULT_PERM, true);
     createFile(getTestRootPath("test/new/newdir/file1"));
     // Fails without overwrite option
     try {
@@ -605,7 +605,7 @@
     if (!renameSupported()) return;
     
     Path src = getTestRootPath("test/hadoop/dir");
-    fc.mkdirs(src, FileContext.DEFAULT_PERM);
+    fc.mkdir(src, FileContext.DEFAULT_PERM, true);
     Path dst = getTestRootPath("test/new/newfile");
     createFile(dst);
     // Fails without overwrite option
@@ -638,14 +638,17 @@
     //HADOOP-4760 according to Closeable#close() closing already-closed 
     //streams should have no effect. 
     Path src = getTestRootPath("test/hadoop/file");
-    FSDataOutputStream out = fc.create(src, EnumSet.of(CreateFlag.CREATE));
+    FSDataOutputStream out = fc.create(src, EnumSet.of(CreateFlag.CREATE),
+            Options.CreateOpts.createParent());
+    
     out.writeChar('H'); //write some data
     out.close();
     out.close();
   }
 
   protected void createFile(Path path) throws IOException {
-    FSDataOutputStream out = fc.create(path, EnumSet.of(CreateFlag.CREATE));
+    FSDataOutputStream out = fc.create(path, EnumSet.of(CreateFlag.CREATE),
+        Options.CreateOpts.createParent());
     out.write(data, 0, data.length);
     out.close();
   }

Modified: hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/TestFileContextDeleteOnExit.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/TestFileContextDeleteOnExit.java?rev=816818&r1=816817&r2=816818&view=diff
==============================================================================
--- hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/TestFileContextDeleteOnExit.java
(original)
+++ hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/TestFileContextDeleteOnExit.java
Sat Sep 19 00:03:04 2009
@@ -23,6 +23,7 @@
 
 import junit.framework.Assert;
 
+import org.apache.hadoop.fs.Options.CreateOpts;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -62,7 +63,8 @@
   }
   
   private void createFile(FileContext fc, Path path) throws IOException {
-    FSDataOutputStream out = fc.create(path, EnumSet.of(CreateFlag.CREATE));
+    FSDataOutputStream out = fc.create(path, EnumSet.of(CreateFlag.CREATE),
+        CreateOpts.createParent());
     out.write(data, 0, data.length);
     out.close();
   }

Added: hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/TestLocalFSFileContextCreateMkdir.java
URL: http://svn.apache.org/viewvc/hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/TestLocalFSFileContextCreateMkdir.java?rev=816818&view=auto
==============================================================================
--- hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/TestLocalFSFileContextCreateMkdir.java
(added)
+++ hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/TestLocalFSFileContextCreateMkdir.java
Sat Sep 19 00:03:04 2009
@@ -0,0 +1,31 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.fs;
+
+
+import org.junit.Before;
+
+public class TestLocalFSFileContextCreateMkdir extends
+  FileContextCreateMkdirBaseTest {
+
+  @Before
+  public void setUp() throws Exception {
+    fc = FileContext.getLocalFSFileContext();
+    super.setUp();
+  }
+}



Mime
View raw message