瀏覽代碼

HADOOP-2195. '-mkdir' behaviour is now closer to Linux shell in case of
errors. (Mahadev Konar via rangadi)


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

Raghu Angadi 17 年之前
父節點
當前提交
9ef7051603
共有 3 個文件被更改,包括 39 次插入2 次删除
  1. 3 0
      CHANGES.txt
  2. 15 2
      src/java/org/apache/hadoop/fs/FsShell.java
  3. 21 0
      src/test/org/apache/hadoop/dfs/TestDFSShell.java

+ 3 - 0
CHANGES.txt

@@ -18,6 +18,9 @@ Trunk (unreleased changes)
 
   BUG FIXES
 
+    HADOOP-2195. '-mkdir' behaviour is now closer to Linux shell in case of
+                 errors. (Mahadev Konar via rangadi)
+    
     HADOOP-2190. bring behaviour '-ls' and '-du' closer to Linux shell 
                  commands in case of errors. (Mahadev Konar via rangadi)
     

+ 15 - 2
src/java/org/apache/hadoop/fs/FsShell.java

@@ -673,8 +673,21 @@ public class FsShell extends Configured implements Tool {
   void mkdir(String src) throws IOException {
     Path f = new Path(src);
     FileSystem srcFs = f.getFileSystem(getConf());
-    if (!srcFs.mkdirs(f)) {
-      throw new IOException("Mkdirs failed to create " + src);
+    FileStatus fstatus = null;
+    try {
+      fstatus = srcFs.getFileStatus(f);
+      if (fstatus.isDir()) {
+        throw new IOException("cannot create directory " 
+            + src + ": File exists");
+      }
+      else {
+        throw new IOException(src + " exists but " +
+            "is not a directory");
+      }
+    } catch(FileNotFoundException e) {
+        if (!srcFs.mkdirs(f)) {
+          throw new IOException("failed to create " + src);
+        }
     }
   }
 

+ 21 - 0
src/test/org/apache/hadoop/dfs/TestDFSShell.java

@@ -255,6 +255,27 @@ public class TestDFSShell extends TestCase {
       ret = ToolRunner.run(shell, argv);
       assertTrue(" -ls on nonexistent glob returns -1",
           (ret < 0));
+      out.reset();
+      argv[0] = "-mkdir";
+      argv[1] = "/testdir";
+      ret = ToolRunner.run(shell, argv);
+      returned = out.toString();
+      assertTrue(" -mkdir returned -1 ", (ret < 0));
+      assertTrue(" -mkdir returned File exists", 
+          (returned.lastIndexOf("File exists") != -1));
+      Path testFile = new Path("/testfile");
+      OutputStream outtmp = srcFs.create(testFile);
+      outtmp.write(testFile.toString().getBytes());
+      outtmp.close();
+      out.reset();
+      argv[0] = "-mkdir";
+      argv[1] = "/testfile";
+      ret = ToolRunner.run(shell, argv);
+      returned = out.toString();
+      assertTrue(" -mkdir returned -1", (ret < 0));
+      assertTrue(" -mkdir returned this is a file ",
+          (returned.lastIndexOf("not a directory") != -1));
+      out.reset();
     } finally {
       if (bak != null) {
         System.setErr(bak);