This is an automated email from the ASF dual-hosted git repository. fokko pushed a commit to branch parquet-1.14.x in repository https://gitbox.apache.org/repos/asf/parquet-java.git
commit 05f2e39cf3add09501c1534328db2452370a582c Author: hellishfire <[email protected]> AuthorDate: Mon Jul 22 15:49:12 2024 +0800 GH-2935: Avoid double close of ParquetFileWriter (#2951) * GH-2935: Avoid double close of ParquetFileWriter * fix comment --------- Co-authored-by: youming.whl <[email protected]> --- .../src/main/java/org/apache/parquet/hadoop/ParquetFileWriter.java | 6 ++++++ .../test/java/org/apache/parquet/hadoop/TestParquetFileWriter.java | 3 +++ 2 files changed, 9 insertions(+) diff --git a/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileWriter.java b/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileWriter.java index db15ba406..814b98c50 100644 --- a/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileWriter.java +++ b/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileWriter.java @@ -170,6 +170,7 @@ public class ParquetFileWriter implements AutoCloseable { // set when end is called private ParquetMetadata footer = null; + private boolean closed; private final CRC32 crc; private final ReusingByteBufferAllocator crcAllocator; @@ -1658,11 +1659,16 @@ public class ParquetFileWriter implements AutoCloseable { @Override public void close() throws IOException { + if (closed) { + return; + } try (PositionOutputStream temp = out) { temp.flush(); if (crcAllocator != null) { crcAllocator.close(); } + } finally { + closed = true; } } diff --git a/parquet-hadoop/src/test/java/org/apache/parquet/hadoop/TestParquetFileWriter.java b/parquet-hadoop/src/test/java/org/apache/parquet/hadoop/TestParquetFileWriter.java index 32e2eac0b..c6be72ff7 100644 --- a/parquet-hadoop/src/test/java/org/apache/parquet/hadoop/TestParquetFileWriter.java +++ b/parquet-hadoop/src/test/java/org/apache/parquet/hadoop/TestParquetFileWriter.java @@ -286,6 +286,9 @@ public class TestParquetFileWriter { w.endColumn(); w.endBlock(); w.end(new HashMap<String, String>()); + // Although writer is already closed in previous end(), + // explicitly close it again to verify double close behavior. + w.close(); ParquetMetadata readFooter = ParquetFileReader.readFooter(configuration, path); assertEquals("footer: " + readFooter, 2, readFooter.getBlocks().size());
