Browse Source

HADOOP-16685: FileSystem#listStatusIterator does not check if given path exists (#1695)

(cherry picked from commit 3161813482868e42befb618d6f5687d8ffed0e5c)
Sahil Takiar 5 years ago
parent
commit
c47d4d9c3f

+ 3 - 8
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileSystem.java

@@ -2103,24 +2103,19 @@ public abstract class FileSystem extends Configured
     private DirectoryEntries entries;
     private int i = 0;
 
-    DirListingIterator(Path path) {
+    DirListingIterator(Path path) throws IOException {
       this.path = path;
+      this.entries = listStatusBatch(path, null);
     }
 
     @Override
     public boolean hasNext() throws IOException {
-      if (entries == null) {
-        fetchMore();
-      }
       return i < entries.getEntries().length ||
           entries.hasMore();
     }
 
     private void fetchMore() throws IOException {
-      byte[] token = null;
-      if (entries != null) {
-        token = entries.getToken();
-      }
+      byte[] token = entries.getToken();
       entries = listStatusBatch(path, token);
       i = 0;
     }

+ 8 - 0
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractGetFileStatusTest.java

@@ -273,6 +273,14 @@ public abstract class AbstractContractGetFileStatusTest extends
     }
   }
 
+  @Test
+  public void testListStatusIteratorNoDir() throws Throwable {
+    describe("test the listStatusIterator call on a path which is not " +
+        "present");
+    intercept(FileNotFoundException.class,
+        () -> getFileSystem().listStatusIterator(path("missing")));
+  }
+
   @Test
   public void testLocatedStatusNoDir() throws Throwable {
     describe("test the LocatedStatus call on a path which is not present");