From 6a859d33aa77260a4329035066c7c63c02df0fcd Mon Sep 17 00:00:00 2001 From: Steve Loughran Date: Mon, 20 Jan 2020 16:23:41 +0000 Subject: [PATCH] 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 --- .../ITestAzureBlobFileSystemCreate.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/ITestAzureBlobFileSystemCreate.java b/hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/ITestAzureBlobFileSystemCreate.java index d9ac03ecf6..94368a4f36 100644 --- a/hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/ITestAzureBlobFileSystemCreate.java +++ b/hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/ITestAzureBlobFileSystemCreate.java @@ -19,6 +19,7 @@ package org.apache.hadoop.fs.azurebfs; import java.io.FileNotFoundException; +import java.io.FilterOutputStream; import java.io.IOException; import java.util.EnumSet; @@ -155,4 +156,32 @@ public void testTryWithResources() throws Throwable { 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"; + }); + } + }); + } + }