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 de3130ede1 GH-39488: [Ruby] Add support for ChunkedArray in Ractor 
(#39490)
de3130ede1 is described below

commit de3130ede1a2db7bbe9e129f21856ee80de0f8cb
Author: Sutou Kouhei <[email protected]>
AuthorDate: Mon Jan 8 07:21:00 2024 +0900

    GH-39488: [Ruby] Add support for ChunkedArray in Ractor (#39490)
    
    ### Rationale for this change
    
    We can't use `@ cache ||= build_cache` idiom in Ractor because Ractor 
requires that shared objects are immutable.
    
    ### What changes are included in this PR?
    
    Compute caches before making ChunkedArray immutable.
    
    ### Are these changes tested?
    
    Yes.
    
    ### Are there any user-facing changes?
    
    Yes.
    * Closes: #39488
    
    Authored-by: Sutou Kouhei <[email protected]>
    Signed-off-by: Sutou Kouhei <[email protected]>
---
 ruby/red-arrow/lib/arrow/chunked-array.rb          |  8 +++++++
 ruby/red-arrow/test/helper/omittable.rb            |  5 ++++
 .../test/{helper/omittable.rb => test-ractor.rb}   | 28 ++++++++++------------
 3 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/ruby/red-arrow/lib/arrow/chunked-array.rb 
b/ruby/red-arrow/lib/arrow/chunked-array.rb
index 7d83becc6d..0cdd9b6a6d 100644
--- a/ruby/red-arrow/lib/arrow/chunked-array.rb
+++ b/ruby/red-arrow/lib/arrow/chunked-array.rb
@@ -24,6 +24,14 @@ module Arrow
     include GenericTakeable
     include InputReferable
 
+    def freeze
+      unless frozen?
+        # Ensure caching
+        chunks
+      end
+      super
+    end
+
     def to_arrow
       self
     end
diff --git a/ruby/red-arrow/test/helper/omittable.rb 
b/ruby/red-arrow/test/helper/omittable.rb
index a1c0334b63..8e1564be47 100644
--- a/ruby/red-arrow/test/helper/omittable.rb
+++ b/ruby/red-arrow/test/helper/omittable.rb
@@ -17,6 +17,11 @@
 
 module Helper
   module Omittable
+    def require_ruby(major, minor, micro=0)
+      return if (RUBY_VERSION <=> "#{major}.#{minor}.#{micro}") >= 0
+      omit("Require Ruby #{major}.#{minor}.#{micro} or later: #{RUBY_VERSION}")
+    end
+
     def require_gi_bindings(major, minor, micro)
       return if GLib.check_binding_version?(major, minor, micro)
       message =
diff --git a/ruby/red-arrow/test/helper/omittable.rb 
b/ruby/red-arrow/test/test-ractor.rb
similarity index 57%
copy from ruby/red-arrow/test/helper/omittable.rb
copy to ruby/red-arrow/test/test-ractor.rb
index a1c0334b63..daf674d135 100644
--- a/ruby/red-arrow/test/helper/omittable.rb
+++ b/ruby/red-arrow/test/test-ractor.rb
@@ -15,22 +15,20 @@
 # specific language governing permissions and limitations
 # under the License.
 
-module Helper
-  module Omittable
-    def require_gi_bindings(major, minor, micro)
-      return if GLib.check_binding_version?(major, minor, micro)
-      message =
-        "Require gobject-introspection #{major}.#{minor}.#{micro} or later: " +
-        GLib::BINDING_VERSION.join(".")
-      omit(message)
-    end
+class RactorTest < Test::Unit::TestCase
+  include Helper::Omittable
 
-    def require_gi(major, minor, micro)
-      return if GObjectIntrospection::Version.or_later?(major, minor, micro)
-      message =
-        "Require GObject Introspection #{major}.#{minor}.#{micro} or later: " +
-        GObjectIntrospection::Version::STRING
-      omit(message)
+  ractor
+  test("ChunkedArray") do
+    require_ruby(3, 1, 0)
+    array = Arrow::Array.new([1, 2, 3])
+    chunked_array = Arrow::ChunkedArray.new([array])
+    Ractor.make_shareable(chunked_array)
+    ractor = Ractor.new do
+      recived_chunked_array = Ractor.receive
+      recived_chunked_array.chunks
     end
+    ractor.send(chunked_array)
+    assert_equal([array], ractor.take)
   end
 end

Reply via email to