This is an automated email from the ASF dual-hosted git repository.

kou pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/main by this push:
     new 00a97fe552 GH-48776: [CI][Ruby][Windows] Ensure removing temporary 
files (#48777)
00a97fe552 is described below

commit 00a97fe55243524a2f0125d530c62dc8978cd769
Author: Sutou Kouhei <[email protected]>
AuthorDate: Thu Jan 8 18:17:02 2026 +0900

    GH-48776: [CI][Ruby][Windows] Ensure removing temporary files (#48777)
    
    ### Rationale for this change
    
    We can't remove a file if someone is still opening the file on Windows.
    
    We use `Tempfile` for tests. It removes associated file when it's GC-ed. If 
we still open the associated file, the GC process reports the following warning:
    
    ```text
    warning: Exception in finalizer 
#<Tempfile::FinalizerManager:0x000001fb3c15ac00 @ open_files={}, @ 
path="D:/a/_temp/batch20260107-2120-ddy0e0.arrow", @ pid=2120, @ unlinked=false>
    ```
    
    ### What changes are included in this PR?
    
    Ensure removing temporary files.
    
    ### Are these changes tested?
    
    Yes.
    
    ### Are there any user-facing changes?
    
    Yes. Only for `gparquet_arrow_file_reader_close()`.
    * GitHub Issue: #48776
    
    Authored-by: Sutou Kouhei <[email protected]>
    Signed-off-by: Sutou Kouhei <[email protected]>
---
 c_glib/parquet-glib/arrow-file-reader.cpp          | 18 ++++++++++++++++
 c_glib/parquet-glib/arrow-file-reader.h            |  4 ++++
 ruby/red-arrow/test/test-feather.rb                |  1 +
 .../test/test-record-batch-stream-reader.rb        |  4 ++++
 ruby/red-arrow/test/test-table.rb                  |  4 ++++
 ruby/red-parquet/lib/parquet/arrow-file-reader.rb  |  2 ++
 ruby/red-parquet/lib/parquet/arrow-file-writer.rb  |  2 ++
 ruby/red-parquet/test/test-arrow-table.rb          |  1 +
 ruby/red-parquet/test/test-boolean-statistics.rb   | 25 ++++++++++++++--------
 9 files changed, 52 insertions(+), 9 deletions(-)

diff --git a/c_glib/parquet-glib/arrow-file-reader.cpp 
b/c_glib/parquet-glib/arrow-file-reader.cpp
index 692fd0ca0a..ddbfde1b4c 100644
--- a/c_glib/parquet-glib/arrow-file-reader.cpp
+++ b/c_glib/parquet-glib/arrow-file-reader.cpp
@@ -181,6 +181,24 @@ gparquet_arrow_file_reader_new_path(const gchar *path, 
GError **error)
   }
 }
 
+/**
+ * gparquet_arrow_file_reader_close:
+ * @reader: A #GParquetArrowFileReader.
+ *
+ * Close the reader.
+ *
+ * Since: 23.0.0
+ */
+void
+gparquet_arrow_file_reader_close(GParquetArrowFileReader *reader)
+{
+  auto parquet_arrow_file_reader = gparquet_arrow_file_reader_get_raw(reader);
+  auto parquet_reader = parquet_arrow_file_reader->parquet_reader();
+  if (parquet_reader) {
+    parquet_reader->Close();
+  }
+}
+
 /**
  * gparquet_arrow_file_reader_read_table:
  * @reader: A #GParquetArrowFileReader.
diff --git a/c_glib/parquet-glib/arrow-file-reader.h 
b/c_glib/parquet-glib/arrow-file-reader.h
index 52d7293bad..04df24b87d 100644
--- a/c_glib/parquet-glib/arrow-file-reader.h
+++ b/c_glib/parquet-glib/arrow-file-reader.h
@@ -43,6 +43,10 @@ GPARQUET_AVAILABLE_IN_0_11
 GParquetArrowFileReader *
 gparquet_arrow_file_reader_new_path(const gchar *path, GError **error);
 
+GPARQUET_AVAILABLE_IN_23_0
+void
+gparquet_arrow_file_reader_close(GParquetArrowFileReader *reader);
+
 GPARQUET_AVAILABLE_IN_0_11
 GArrowTable *
 gparquet_arrow_file_reader_read_table(GParquetArrowFileReader *reader, GError 
**error);
diff --git a/ruby/red-arrow/test/test-feather.rb 
b/ruby/red-arrow/test/test-feather.rb
index 21d8a2c318..a182c7a5d2 100644
--- a/ruby/red-arrow/test/test-feather.rb
+++ b/ruby/red-arrow/test/test-feather.rb
@@ -29,6 +29,7 @@ class FeatherTest < Test::Unit::TestCase
     begin
       yield(@output)
     ensure
+      GC.start # Ensure freeing Arrow::Table that refers @output.path.
       @output.close!
     end
   end
diff --git a/ruby/red-arrow/test/test-record-batch-stream-reader.rb 
b/ruby/red-arrow/test/test-record-batch-stream-reader.rb
index 6db2dd4925..3222734ac9 100644
--- a/ruby/red-arrow/test/test-record-batch-stream-reader.rb
+++ b/ruby/red-arrow/test/test-record-batch-stream-reader.rb
@@ -16,6 +16,10 @@
 # under the License.
 
 class RecordBatchStreamReaderTest < Test::Unit::TestCase
+  def teardown
+    GC.start # Ensure freeing Arrow::RecordBatch that refers tempfile.path.
+  end
+
   test("write/read") do
     fields = [
       Arrow::Field.new("uint8",  :uint8),
diff --git a/ruby/red-arrow/test/test-table.rb 
b/ruby/red-arrow/test/test-table.rb
index 2117e60df9..45b178f318 100644
--- a/ruby/red-arrow/test/test-table.rb
+++ b/ruby/red-arrow/test/test-table.rb
@@ -747,6 +747,10 @@ class TableTest < Test::Unit::TestCase
           @file.path
         end
 
+        def teardown
+          GC.start # Ensure freeing Arrow::Table that refers @file.path.
+        end
+
         sub_test_case("save: auto detect") do
           test("arrow") do
             output = create_output(".arrow")
diff --git a/ruby/red-parquet/lib/parquet/arrow-file-reader.rb 
b/ruby/red-parquet/lib/parquet/arrow-file-reader.rb
index 6923c21987..aa533eecdd 100644
--- a/ruby/red-parquet/lib/parquet/arrow-file-reader.rb
+++ b/ruby/red-parquet/lib/parquet/arrow-file-reader.rb
@@ -17,6 +17,8 @@
 
 module Parquet
   class ArrowFileReader
+    include Arrow::BlockClosable
+
     def each_row_group
       return to_enum(__method__) {n_row_groups} unless block_given?
 
diff --git a/ruby/red-parquet/lib/parquet/arrow-file-writer.rb 
b/ruby/red-parquet/lib/parquet/arrow-file-writer.rb
index 137dc518e3..5677577f22 100644
--- a/ruby/red-parquet/lib/parquet/arrow-file-writer.rb
+++ b/ruby/red-parquet/lib/parquet/arrow-file-writer.rb
@@ -17,6 +17,8 @@
 
 module Parquet
   class ArrowFileWriter
+    include Arrow::BlockClosable
+
     # Write data to Apache Parquet.
     #
     # @return [void]
diff --git a/ruby/red-parquet/test/test-arrow-table.rb 
b/ruby/red-parquet/test/test-arrow-table.rb
index 1ea2669e31..240c4ff138 100644
--- a/ruby/red-parquet/test/test-arrow-table.rb
+++ b/ruby/red-parquet/test/test-arrow-table.rb
@@ -50,6 +50,7 @@ class TestArrowTable < Test::Unit::TestCase
     begin
       yield(@output)
     ensure
+      GC.start # Ensure freeing Arrow::Table that refers @output.path.
       @output.close!
     end
   end
diff --git a/ruby/red-parquet/test/test-boolean-statistics.rb 
b/ruby/red-parquet/test/test-boolean-statistics.rb
index 013500484b..788995ba02 100644
--- a/ruby/red-parquet/test/test-boolean-statistics.rb
+++ b/ruby/red-parquet/test/test-boolean-statistics.rb
@@ -17,15 +17,22 @@
 
 class TestBooleanStatistics < Test::Unit::TestCase
   def setup
-    file = Tempfile.open(["data", ".parquet"])
-    array = Arrow::BooleanArray.new([nil, false, true])
-    table = Arrow::Table.new("boolean" => array)
-    writer = Parquet::ArrowFileWriter.new(table.schema, file.path)
-    chunk_size = 1024
-    writer.write_table(table, chunk_size)
-    writer.close
-    reader = Parquet::ArrowFileReader.new(file.path)
-    @statistics = 
reader.metadata.get_row_group(0).get_column_chunk(0).statistics
+    Tempfile.create(["data", ".parquet"]) do |file|
+      array = Arrow::BooleanArray.new([nil, false, true])
+      table = Arrow::Table.new("boolean" => array)
+      Parquet::ArrowFileWriter.open(table.schema, file.path) do |writer|
+        chunk_size = 1024
+        writer.write_table(table, chunk_size)
+        writer.close
+      end
+      Parquet::ArrowFileReader.open(file.path) do |reader|
+        @statistics =
+          reader.metadata.get_row_group(0).get_column_chunk(0).statistics
+        yield
+        @statistics = nil
+      end
+      GC.start # Ensure freeing @statistics that refers file.path.
+    end
   end
 
   def test_min

Reply via email to