فهرست منبع

HADOOP-16785. followup to abfs close() fix.

Adds one extra test to the ABFS close logic, to explicitly
verify that the close sequence of FilterOutputStream is
not going to fail.

This is just a due-diligence patch, but it helps ensure
that no regressions creep in in future.

Contributed by Steve Loughran.

Change-Id: Ifd33a8c322d32513411405b15f50a1aebcfa6e48
Steve Loughran 5 سال پیش
والد
کامیت
6a859d33aa

+ 29 - 0
hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/ITestAzureBlobFileSystemCreate.java

@@ -19,6 +19,7 @@
 package org.apache.hadoop.fs.azurebfs;
 package org.apache.hadoop.fs.azurebfs;
 
 
 import java.io.FileNotFoundException;
 import java.io.FileNotFoundException;
+import java.io.FilterOutputStream;
 import java.io.IOException;
 import java.io.IOException;
 import java.util.EnumSet;
 import java.util.EnumSet;
 
 
@@ -155,4 +156,32 @@ public class ITestAzureBlobFileSystemCreate extends
       GenericTestUtils.assertExceptionContains(fnfe.getMessage(), inner);
       GenericTestUtils.assertExceptionContains(fnfe.getMessage(), inner);
     }
     }
   }
   }
+
+  /**
+   * Attempts to write to the azure stream after it is closed will raise
+   * an IOException.
+   */
+  @Test
+  public void testFilterFSWriteAfterClose() throws Throwable {
+    final AzureBlobFileSystem fs = getFileSystem();
+    Path testPath = new Path(TEST_FOLDER_PATH, TEST_CHILD_FILE);
+    FSDataOutputStream out = fs.create(testPath);
+    intercept(FileNotFoundException.class,
+        () -> {
+          try (FilterOutputStream fos = new FilterOutputStream(out)) {
+            fos.write('a');
+            fos.flush();
+            out.hsync();
+            fs.delete(testPath, false);
+            // trigger the first failure
+            throw intercept(FileNotFoundException.class,
+                () -> {
+              fos.write('b');
+              out.hsync();
+              return "hsync didn't raise an IOE";
+            });
+          }
+        });
+  }
+
 }
 }