From 59c9342d2742924423f7ebe7df90e809bda05c2e Mon Sep 17 00:00:00 2001 From: Laszlo Bodor Date: Fri, 4 Sep 2026 14:40:03 +0200 Subject: [PATCH] GH-3767: Make PageReader AutoCloseable Widen PageReader to extend AutoCloseable with a default no-op close(), so implementations that own resources can release them through the standard try-with-resources / AutoCloseables idiom rather than a bespoke method. Existing implementations remain source- and binary-compatible. Rename ColumnChunkPageReader.releaseBuffers() to close() and let the enclosing ColumnChunkPageReadStore.close() hand its readers to AutoCloseables.uncheckedClose() directly. --- .../java/org/apache/parquet/column/page/PageReader.java | 8 +++++++- .../apache/parquet/hadoop/ColumnChunkPageReadStore.java | 5 +++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/parquet-column/src/main/java/org/apache/parquet/column/page/PageReader.java b/parquet-column/src/main/java/org/apache/parquet/column/page/PageReader.java index 0b4321ca78..530fc959a0 100644 --- a/parquet-column/src/main/java/org/apache/parquet/column/page/PageReader.java +++ b/parquet-column/src/main/java/org/apache/parquet/column/page/PageReader.java @@ -21,7 +21,7 @@ /** * Reader for a sequence a page from a given column chunk */ -public interface PageReader { +public interface PageReader extends AutoCloseable { /** * @return the dictionary page in that chunk or null if none @@ -37,4 +37,10 @@ public interface PageReader { * @return the next page in that chunk or null if after the last page */ DataPage readPage(); + + /** + * Releases any resources this reader holds (buffers, native handles, etc.). + */ + @Override + default void close() {} } diff --git a/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ColumnChunkPageReadStore.java b/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ColumnChunkPageReadStore.java index dfdd6c5d82..3e3f242152 100644 --- a/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ColumnChunkPageReadStore.java +++ b/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ColumnChunkPageReadStore.java @@ -338,7 +338,8 @@ public DictionaryPage readDictionaryPage() { } } - private void releaseBuffers() { + @Override + public void close() { releaser.close(); } } @@ -415,7 +416,7 @@ public void close() { // Wrap each reader + the releaser as an AutoCloseable so AutoCloseables.uncheckedClose() // releases every resource even if one fails, and aggregates failures via suppressed exceptions List toClose = new ArrayList<>(readers.size() + 1); - readers.values().forEach(reader -> toClose.add(reader::releaseBuffers)); + readers.values().forEach(reader -> toClose.add(reader)); toClose.add(releaser); AutoCloseables.uncheckedClose(toClose); }